我有一个托管在localhost上的Web服务器。我访问的网站是一个" Todo列表应用程序"用AngularJS编写。要加载todo,浏览器会获取包含该信息的JSON文件。一个例子:
[
{"name":"Clean the house"},
{"name":"Water the dog"},
{"name":"Feed the lawn"},
{"name":"Pay dem bills"},
{"name":"Run"},
{"name":"Swim"}
]
然后循环遍历所有项目"打印"他们到网站上。我有各种选择,如" Save"和"删除"。它们在客户端工作,但这种方式不允许我正确保存它们,因为刷新浏览器时,所有内容都将使用服务器的静态JSON文件重置。
我想知道是否有某种方法可以使用NodeJ来托管网站并监听传入的AJAX请求并根据该文件编辑文件中的内容。
答案 0 :(得分:0)
在nodejs中异步写入文件可以按如下方式完成。
var fs = require('fs');
var fileName = './file.json';
var file = require(fileName);
file.key = "new value"; // This will be coming as a http POST method from your view
fs.writeFile(fileName, JSON.stringify(file), function (err) {
if (err) return console.log(err);
console.log(JSON.stringify(file));
console.log('writing to ' + fileName);
});
需要注意的是,json是在一行上写入文件而不是美化。例如:
{
"key": "value"
}
将......
{"key": "value"}
要避免这种情况,只需将这两个额外的参数添加到JSON.stringify
即可JSON.stringify(file, null, 2)
null - 表示替换器功能。 (在这种情况下,我们不想改变过程)
2 - 表示缩进的空格。
答案 1 :(得分:0)
NodeJS不会保留开箱即用的数据。 你需要像NodeJS + Express这样的东西和像POST这样的特殊CRUD路径来创建项目,或者删除DELETE来删除它们。
如果你想在它后面添加一个SQL数据库,你需要使用MongoDB或Sequelize,在这个路由中你必须添加像mongoose这样的数据持久层。
每个ORM都需要指定一个可以保存的Datamodel。
这是一个mongoose实现的例子:
'use strict';
/**
* Module dependencies.
*/
var mongoose = require('mongoose'),
Schema = mongoose.Schema;
var plugins = require('./model.server.plugins');
/**
* Customer Schema
*/
var CustomerSchema = new Schema({
name: {
type: String,
default: '',
required: 'Please fill a name',
trim: true
},
created: {
type: Date,
default: Date.now
}
});
mongoose.model('Customer', CustomerSchema);
这是控制器 '使用严格的';
/**
* Module dependencies.
*/
var mongoose = require('mongoose'),
errorHandler = require('./errors.server.controller'),
Customer = mongoose.model('Customer'),
_ = require('lodash');
/**
* Create a Customer
*/
exports.create = function(req, res) {
var customer = new Customer(req.depopulated);
customer.user = req.user;
customer.save(function(err) {
if (err) {
return res.status(400).send({
message: errorHandler.getErrorMessage(err)
});
} else {
res.jsonp(customer);
}
});
};
这里是路线
router.route('/')
.post(customers.create);