如何使用 NodeJS 编辑服务器存储的 JSON 文件

How to edit server stored JSON file with NodeJS

提问人:drowZ 提问时间:7/19/2016 更新时间:7/19/2016 访问量:1143

问:

我有一个托管在 localhost 上的 Web 服务器。我正在访问的网站是用 AngularJS 编写的“待办事项列表应用程序”。为了加载待办事项,浏览器会获取一个包含信息的 JSON 文件。举个例子:

    [
  {"name":"Clean the house"},
  {"name":"Water the dog"},
  {"name":"Feed the lawn"},
  {"name":"Pay dem bills"},
  {"name":"Run"},
  {"name":"Swim"}
]

然后,它会遍历所有项目并将它们“打印”到网站上。我有多种选择,例如“保存”和“删除”。它们在客户端工作,但这种方式不允许我正确保存它们,因为当浏览器刷新时,所有内容都会使用服务器的静态 JSON 文件重置。

我想知道是否有某种方法可以使用 NodeJs 来托管网站并侦听传入的 AJAX 请求并据此编辑文件中的内容。

AngularJS JSON node.js 服务器端

评论


答:

0赞 gandharv garg 7/19/2016 #1

在 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 - 表示 Replacer 函数。(在这种情况下,我们不想更改过程)

2 - 表示要缩进的空格。

评论

0赞 drowZ 7/20/2016
我理解其中的大部分内容,除了这个:“file.key = ”新值“;从您的视图来看,这将作为 http POST 方法出现”。当您说它将作为 POST 输入时,您的意思是它会自动被视为一个,还是我应该在那里放其他东西?
0赞 Felix 7/19/2016 #2

NodeJS 不会保留开箱即用的数据。 您需要像 NodeJS + Express 这样的特殊 CRUD 路由,例如用于创建项目的 POST 或用于删除项目的 DELETE。

在此路由中,如果要使用 MongoDB,则必须添加一个数据持久层,例如 mongoose,或者如果要在其后面添加 SQL 数据库,则必须添加 Sequelize。

每个 ORM 都需要指定一个可以保存的数据模型。

下面是一个猫鼬实现的例子:

 '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);

评论

0赞 drowZ 7/20/2016
谢谢,但我需要更简单一点的东西。我理解你在说的一些东西,但我只想改变一个JSON文件。我不担心其他任何事情。我考虑过使用一个名为 ngCookies 的 angular 依赖项将其存储在本地计算机上,但它不允许实际的服务器更新。你能推荐一些更简单的东西吗?
0赞 Felix 7/20/2016
当您需要数据持久化并且不喜欢使用 da 数据库作为存储时,您可以读取和写入文件,但这种方法并不漂亮,我不会在生产环境中使用它。