个参数是结果
* 成功是数组,失败是undefined
*/
exports.save = (student, callback) => {
fs.readFile('./Db.json', 'utf8', (err, data) => {
if (err) {
return callback(err)
}
// 得到所有学生信息
let students = JSON.parse(data).students
// 为新加的学生添加一个唯一的id属性(原来最大id属性值基础上加1)
if (students.length === 0) {
// 如果原始数据文件中没有学生信息
student.id = 1
} else {
student.id = parseInt(students[students.length-1].id) + 1
}
students.push(student)
// 把新增加学生信息后的对象转换成字符串保存到数据文件中
let dataStr = JSON.stringify({
students: students
})
fs.writeFile('./Db.json', dataStr, err => {
if (err) {
// 如果写入失败,则把错误对象传递给它
return callback(err)
}
// 成功就没错,所以错误对象是 null
callback(null)
})
})
}
。。。
由于篇幅原因,这里只罗列了添加学生信息API的实现代码。这里还有一个非常重要的知识点:怎样获取到一个函数内部异步操作的结果?
只能是通过回调函数。
或许有一些其他的内置模块,包括封装的API也可以拿到异步操作的结果,但是其底层都是利用了回调函数的思想。比如常见的Node内置events
事件模块等。
- 视图文件编写
这里只需强调一点,在编写视图文件的时候,需要把一些动态的数据用模板语法包裹起来,能够使得模板引擎正确的渲染模板文件即可。
- 启动服务后看结果(略)
后话
需要学习资料和案例源码的伙伴可以去GitHub上查看,如果您对这案例或者学习资料有更好的看法,欢迎issue,或者评论,谢谢。