Node.js开发 ---- 留言板实例fs读写文件

项目结构如下:

app.js

const exp = require(‘express‘),
    bodyParser = require(‘body-parser‘),
    fs = require(‘fs‘),
    multer = require(‘multer‘),
    app = exp(),
    multipart = multer();  

// 用来创建对象的方法如上面的exp()/multer()
// 可以称为工厂方法  

app.use(exp.static(‘static‘))
app.use(bodyParser.urlencoded())  

app.post(‘/add‘, multipart.array(), (req, res) => {
    console.log(multipart.array());
    // content留言内容
    var content = req.body.content
    // message是JSON数据格式
    var message = {
        content:content,
        time: new Date(),
        ip: req.ip
    };  

    // 异步判断文件是否存在
    fs.exists(‘data‘, (exists) => {
        if (!exists) {
            // 如果文件不存在,则同步创建文件
            // 即文件创建成功后才继续执行后续代码
            fs.mkdirSync(‘data‘);
        }  

        fs.appendFile(‘data/message.txt‘, JSON.stringify(message) + ‘,‘, (error) => {
            if (error) {
                // %s称为占位符
                console.error(‘保存文件时发生错误:%s‘, error)
            }
        })  

    })
    // 文件后缀名决定操作系统用什么图标显示文件
    // 决定操作系统用什么程序打开文件
    // appendFile可以将数据附加到文件的末尾,
    // 如果文件不存在,它会自动创建文件  

    // 判断文件或文件夹是否存在 fs.exists
    // 创建文件夹 fs.mkdir
    // 删除文件 fs.unlink
    // 删除文件夹 fs.rmdir  必须是空文件夹才能删除
    // 读取文件 fs.readFile  

    res.status(200).json({ message: ‘感谢您的留言!‘ })
})  

//
app.get(‘/messages‘, (req, res) => {
    fs.exists(‘data/message.txt‘, (exists) => {
        if (exists) {
            fs.readFile(‘data/message.txt‘, (error, data) => {
                if (!error) {
                    var result = ‘[‘ + data;
                    result = result.substr(0, result.length - 1);
                    result = result + ‘]‘;
                    // console.log(result);
                    res.status(200).send(result);
                }
            })
        }
        else {
            res.status(200).send(‘[]‘);
        }
    })
})  

app.listen(3000, () => console.log(‘Server Running..‘));

 

add.html

<!DOCTYPE html>
<html>
    <head>
        <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no">
        <meta charset="utf-8">
        <meta name="author" content="张强">
        <title>留言</title>
        <style>  

        </style>
        <link rel="stylesheet" href="alert.css">
        <script src="alert.js"></script>
    </head>
    <body>
        <form action="add" method="POST">
            <textarea name="content" id="content" cols="60" rows="10" placeholder="亲,说点什么吧..."></textarea><br>
            <input type="submit" value="提交">
        </form>
        <script src="add.js"></script>
    </body>
</html>

  

index.js

var xhr = new XMLHttpRequest()  

xhr.onreadystatechange = function(){
    if(xhr.readyState == 4){
        // responseText响应文本
        console.log(xhr.responseText);
        var arr = JSON.parse(xhr.responseText);
        // arr数组
        console.log(arr);
        //
        var messages = ‘‘;
        // 反向循环一个数组,使最新的留言出现最上面
        for(var i = arr.length - 1; i > -1; i--){
            var message = arr[i];  

            // 使用DOM向页面添加留言数据
            // var box = document.createElement(‘div‘)
            // document.body.appendChild(box)  

            // var content = document.createElement(‘p‘)
            // content.innerText = message.content
            // box.appendChild(content)  

            // var time = document.createElement(‘span‘)
            // time.innerText = formatDateTime(new Date(message.time))
            // box.appendChild(time)  

            // var ip = document.createElement(‘span‘)
            // ip.innerText = formatIP(message.ip)
            // box.appendChild(ip)  

            // 使用拼字符串的方法向页面添加留言
            messages += ‘<section>‘
            messages += ‘<p>‘
            messages += message.content
            messages += ‘</p>‘
            messages += ‘<span>‘
            messages += formatDateTime(new Date(message.time));
            messages += ‘</span>‘
            messages += ‘<span>‘
            messages += formatIP(message.ip);
            messages += ‘</span>‘
            messages += ‘</section>‘
        }  

        document.querySelector(‘article‘).innerHTML = messages
    }
}  

xhr.open(‘GET‘, ‘messages‘)
xhr.send()  

function formatDateTime(t){
    var M = t.getMonth() + 1,
        d = t.getDate(),
        h = t.getHours(),
        m = t.getMinutes()  

        // js区分大小写!所以可以使用M、m表示两个不同的变量  

    M = M < 10 ? ‘0‘ + M : M
    d = d < 10 ? ‘0‘ + d : d
    h = h < 10 ? ‘0‘ + h : h
    m = m < 10 ? ‘0‘ + m : m  

    return t.getFullYear() + ‘-‘ + M + ‘-‘ + d + ‘ ‘ + h + ‘:‘ + m
}  

function formatIP(ip){
    if(ip.startsWith(‘::1‘)){
        return ‘127.0.0.1‘
    }
    if(ip.startsWith(‘::ffff:‘)){
        return ip.substr(7)
    }
}

 

 最终数据以json格式储存在message.txt

时间: 2024-10-18 02:50:15

Node.js开发 ---- 留言板实例fs读写文件的相关文章

Node.js开发入门—Stream用法详解

Stream是Node.js中非常重要的一个模块,应用广泛.一个流是一个具备了可读.可写或既可读又可写能力的接口,通过这些接口,我们可以和磁盘文件.套接字.HTTP请求来交互,实现数据从一个地方流动到另一个地方的功能. 所有的流都实现了EventEmitter的接口,具备事件能力,通过发射事件来反馈流的状态.比如有错误发生时会发射"error"事件,有数据可被读取时发射"data"事件.这样我们就可以注册监听器来处理某个事件,达到我们的目的. Node.js定义了R

node.js开发指南读书笔记(1)

3.1 开始使用Node.js编程 3.1.1 Hello World 将以下源代码保存到helloworld.js文件中 console.log('Hello World!'); console.log('%s:%d', 'hello', 25); 找到文件位置,执行node helloworld.js.结果如下: 3.1.2 Node.js命令行工具 输入:node --help可以看到详细的帮助信息. 除了直接运行脚本外,node --help显示的用法中说明了另一种输出hello wor

使用 node.js 开发前端打包程序 ---转载

我们在做前端开发的时候经常会在部署上线的时候做程序的打包和合并,我们接下来就会对如何使用 node.js 开发前端打包程序做非常深入的讲解,希望能够帮到有需要的同学. 我们现在做前端开发更多的是多人共同协作开发,每个人负责不同的模块,便于开发和调试.这样就导致我们最后部署上线的时候需要把所有人开发的模块进行合并,生成单个或多个文件上线.如果手动合并的话肯定是费时又费力,而且非常容易出错,所以我们一般都是通过一些工具来实现自动合并的功能. 打包程序的原理非常简单,入口文件->寻找依赖关系->替换

Node.js开发入门—使用http访问外部世界

Node.js的http模块,不但可以构建服务器,也可以作为客户端类库来访问别的服务器.关键就在两个方法: http.request(options[,callback]) http.get(path[,callback]) 除了http,还会用到FileSystem模块和Stream中的stream.Readable和stream.Writable. 先来大概介绍一下相关API吧. API解释 http.request()方法接受一个options参数,这个参数可以是对象,用来指明你要访问的网

Node.js开发入门—HTTP文件服务器

HelloWorld示例只有演示意义,这次我们来搞一个实际的例子:文件服务器.我们使用Node.js创建一个HTTP协议的文件服务器,你可以使用浏览器或其它下载工具到文件服务器上下载文件. 用Node.js实现的HTTP文件服务器,比我在Qt网络编程实战之HTTP服务器视频课程里用Qt实现的版本,复杂度要小太多太多了. 为了读取文件,我们会用到File System模块(名字是"fs"),Stream,我们还要分析URL,区别HTTP方法,还会用到EventEmitter. 文件服务器

Node.js开发入门—HelloWorld再分析

在Node.js开发入门(1)我们用http模块实现了一个简单的HelloWorld网站,这次我们再来仔细分析下代码,了解更多的细节. 先看看http版本的HelloWorld代码: 代码就是这么简单: // 引入http模块 var http = require("http"); // 创建server,指定处理客户端请求的函数 http.createServer( function(request, response) { response.writeHead(200, {&quo

【读书笔记】Node.js开发指南

一:Node.js是什么? 正如当年为了统一 JavaScript 语言标准,人们制定了 ECMAScript 规范一样,如今为了统一 JavaScript 在浏览器之外的实现, CommonJS 诞生了. CommonJS 试图定义一套普通应用程序使用的API,从而填补 JavaScript 标准库过于简单的不足. CommonJS 的终极目标是制定一个像 C++ 标准库一样的规范,使得基于 CommonJS API 的应用程序可以在不同的环下运行,就像用 C++ 编写的应用程序可以使用不同的

Node.js开发入门—语音合成示例

出于项目需要,搞了一个语音合成(TTS)的小示例,使用的是OKVoice. 我想在PC上测试,OKVoice的快速接入API可以实现我的目的,文档在这里:http://dev.okvoice.com/file.php. 直接上代码吧,okVoiceTts.js,内容如下: var http = require('http'); var fs =require('fs'); var crypto = require('crypto'); var util = require('util'); va

Node.js开发入门—Angular简单示例

在"使用AngularJS"中,我们提到了如何在Node.js项目中引入AngularJS,这次提供一个非常简单的示例,演示AngularJS里的指令.数据绑定.服务等内容. 我准备做Web后台管理系统,不同的管理员会有不同的权限,管理员登录后看到的菜单和他的权限有关,能看到什么,是动态生成的(类似RBAC).本文的示例从这个项目而来,当然,现在还是最简单的. 如果没有特别说明,后面我们用到的示例都使用express generator生成. Angular小demo 先搞起来吧. 第