我有一个带有两个对象的db.json文件:
这是对象...
{
"members": [
{
"id": 1,
"firstName": "John",
"lastName": "Doe",
"jobTitle": "Driver",
"team": "Formula 1 - Car 77",
"status": "Active"
},
{
"id": 2,
"firstName": "Alex",
"lastName": "Sainz",
"jobTitle": "Driver",
"team": "Formula 1 - Car 78",
"status": "Active"
},
{
"id": 3,
"firstName": "Jeb",
"lastName": "Jackson",
"jobTitle": "Reserve Driver",
"team": "Formula 1 - Car 77",
"status": "Inactive"
}
],
"teams": [
{
"id": 1,
"teamName": "Formula 1 - Car 77"
},
{
"id": 2,
"teamName": "Formula 1 - Car 8"
},
{
"id": 3,
"teamName": "Formula 2 - Car 54"
},
]
}
我将添加一个新成员,并且我想对该对象进行定位。
这是我的NODE JS代码
// Submit Form!
app.post('/api/addMember', (req, res) => {
var isWriteable = 'is writable';
var isNotWriteable = 'is not writable';
console.log('REQ BODY: ', req.body);
request('http://localhost:3000/addMember', (err, response, body) => {
if (response.statusCode <= 500) {
res.send(body);
// console.log('RESPONSE!: ', response);
// console.log('All Members BODY!: ', body);
// console.log('REQ!: ', req);
// Now can we Write to the file
fs.access(dbFile, fs.constants.W_OK, (err) => {
console.log(`${dbFile} ${err ? isNotWriteable : isWriteable}`);
if (!err) {
fs.open(dbFile, 'wx', (err, fd) => {
if (err) {
if (err.code === 'EEXIST') {
console.error('DB JSON already exists');
dbFileNewMembers.push(dbFileMembers);
dbFileNewTeams.push(dbFileTeams);
console.log('DB FILE NEW JSON MEMBERS:', dbFileNewMembers);
console.log('DB FILE NEW JSON TEAMS:', dbFileNewTeams);
// saveNewMember(req.body)
// .then(result => {
//
// dbFileNewJSON.push(dbFileNewMembers);
// dbFileNewJSON.push(dbFileNewTeams);
//
// console.log('DB FILE NEW JSON:', dbFileNewJSON);
//
// console.log('RESULT OF SAVE NEW MEMBER: ', result);
// });
// fs.appendFile(dbFile, JSON.stringify(req.body), 'utf8', (err) => {
// if (err) {
// console.log('ERROR in saving a member: BODY: ', err);
// } else {
//
// console.log('SUCCESS saving new member!', req.body);
// }
// });
return;
}
throw err;
}
});
}
});
} else {
console.log('ERROR! DAMN! We blew it!', err);
}
});
});
我在注释掉的部分尝试了两种功能。
我得到的是,新的TEAM成员添加在对象的“末尾”而不是TEAMS对象的末尾。
这就是我要尝试的全部。
我确实看过:
和
但他们没有解决我的问题。
我知道我需要使用appendFile()没问题,但是我需要在主JSON内附加到特定对象,在这种情况下,是TEAMS,在将来的情况下,可能需要更新团队成员,因此,更新具体的团队成员。
谢谢你的帮助。
更新!
KG提出了一个建议,我对此进行了修改。
以下是变量:
var dbFileJSON = require('./db.json');
var obj = JSON.stringify(dbFileJSON);
console.log('DBFILE OBJ: ', obj);
console.log('DBFILE MEMBERS OBJ BEFORE PUSH: ', dbFileJSON);
dbFileJSON['members'].push(newMember);
console.log('DBFILE MEMBERS OBJ AFTER PUSH: ', dbFileJSON);
dbFileJSON = JSON.stringify(dbFileJSON);
console.log('DBFILE MEMBERS OBJ FINAL STRINGIFY: ', dbFileJSON);
dbFileJSON = JSON.parse(dbFileJSON);
console.log('DBFILE MEMBERS OBJ FINAL: ', dbFileJSON);
console.log('UPDATED TEAM members: ', dbFileJSON);
结果直接将其添加到“ MEMBERS”阵列的底部!
在实施KG的答案之前,这是我找到潜在答案的地方。
https://stackoverflow.com/questions/38716025/how-to-replace-old-json-object-with-a-new-one-with-nodejs
现在,剩下的唯一问题是:我需要替换db.json,因为它没有这样做。
我的最后一个问题是:由于我仍在获取原始JSON格式的文件,因此如何用一个新内容替换整个JSON文件。这是server.js文件的顶部,可以帮助您更好地了解自己的位置。
const express = require('express');
const cors = require('cors');
const bodyParser = require('body-parser');
const helmet = require('helmet');
const path = require('path');
const request = require('request');
const fs = require("fs");
var hsts = require('hsts');
var xssFilter = require('x-xss-protection');
var nosniff = require('dont-sniff-mimetype');
var dbFileJSON = require('./db.json');
var dbFile = 'db.json';
var dbFileMembers = [];
var dbFileTeams = [];
const app = express();
app.use(cors());
app.use(express.static('assets'));
app.use(bodyParser.json());
app.use(bodyParser.raw());
app.use(bodyParser.urlencoded({ extended: true }));
app.disable('x-powered-by');
app.use(xssFilter());
app.use(nosniff());
app.set('etag', false);
app.use(helmet({
noCache: false
}));
app.use(hsts({
maxAge: 15552000 // 180 days in seconds
}));
app.get('/api/members', (req, res) => {
request('http://localhost:3000/members', (err, response, body) => {
if (response.statusCode <= 500) {
res.send(body);
dbFileMembers.push(body);
console.log('BODY MEMBERS: ', body);
console.log('BODY MEMBERS DBFILEMEMBERS: ', dbFileMembers);
console.log('DBFILE: ', dbFileJSON);
console.log('SUCCESS! We got the members ', dbFileMembers);
} else {
console.log('ERROR getting MEMBERS: ', err);
}
});
});
// TODO: Dropdown! DONE!
app.get('/api/teams', (req, res) => {
request('http://localhost:3000/teams', (err, response, body) => {
if (response.statusCode <= 500) {
res.send(body);
dbFileTeams.push(body);
console.log('SUCCESS! We got the TEAMS! ', JSON.parse(dbFileTeams));
} else {
console.log('ERROR getting TEAMS: ', err);
}
});
});
这是我添加新会员的代码
// Submit Form!
app.post('/api/addMember', (req, res) => {
var isWriteable = 'is writable';
var isNotWriteable = 'is not writable';
console.log('REQ BODY: ', req.body);
request('http://localhost:3000/addMember', (err, response, body) => {
if (response.statusCode <= 500) {
res.send(body);
fs.access(dbFile, fs.constants.W_OK, (err) => {
console.log(`${dbFile} ${err ? isNotWriteable : isWriteable}`);
if (!err) {
fs.open(dbFile, 'wx', (err, fd) => {
if (err) {
console.log('FD: ', fd);
if (err.code === 'EEXIST') {
console.error('DB JSON already exists');
console.log('DB FILE JSON MEMBERS:', dbFileMembers);
console.log('DB FILE JSON TEAMS:', dbFileTeams);
const newMember = req.body;
var obj = JSON.stringify(dbFileJSON);
console.log('DBFILE OBJ: ', obj);
console.log('DBFILE MEMBERS OBJ BEFORE PUSH: ', dbFileJSON);
dbFileJSON['members'].push(newMember);
console.log('DBFILE MEMBERS OBJ AFTER PUSH: ', dbFileJSON);
dbFileJSON = JSON.stringify(dbFileJSON);
console.log('DBFILE MEMBERS OBJ FINAL STRINGIFY: ', dbFileJSON);
dbFileJSON = JSON.parse(dbFileJSON);
console.log('DBFILE MEMBERS OBJ FINAL: ', dbFileJSON);
console.log('UPDATED TEAM members: ', dbFileJSON);
}
}
});
}
});
} else {
console.log('ERROR! DAMN! We blew it!', err);
}
});
});
app.get('*', (req, res) => {
res.sendFile(path.join(__dirname, 'dist/my-app/index.html'));
});
app.listen('8000', () => {
console.log('Vrrroooom Vrrroooom! Server starting!');
});
而已!任何进一步的评论将是花花公子!
如果您不必使用appendFile。您可以尝试这样的事情。
const data = JSON.parse(fs.readFileSync('./db.json'));
data["places"] = { location: 'pta' }
fs.writeFileSync('db.json', JSON.stringify(data, null, 4));
请注意,我使用了阻塞功能。但是沿着这些思路。
编辑:查看您的代码,您可以执行此操作。
app.post('/api/addMember', (req, res) => {
const filename = './db.json';
request('http://localhost:3000/addMember', async(err, response, body) => {
const data = await readFileJson(filename);
data['newmemeber'] = req.body; // add to object
await writeFileJSON(filename, JSON.stringify(data, null, 4)); // save data to file.
res.json({ code: 1, message: 'saved to db!', data: {} })
});
});
function readFileJson(filename) {
return new Promise((resolve, reject) => {
fs.readFile(filename, 'utf-8', function(err, data) {
if (err) {
return resolve({});
}
try {
return resolve(JSON.parse(data));
} catch (err) {
console.log(err);
return resolve({});
}
});
});
}
function writeFileJSON(filename, data) {
return new Promise((resolve, reject) => {
fs.writeFile(filename, data, function(err, data) {
if (err) {
return reject(err);
}
return resolve();
});
});
}
遵循这些原则行之有效。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句