如何将数据附加到具有 javascript/nodejs 中特定索引的 JSON
How to append data to a JSON with a specific index in javascript/nodejs
我正在执行基本的 'Visitor Book' 功能。
用户可以提交一个小表格(包含三个输入:姓名、消息和表情符号)。
我在我的路由器组件中用 req.body 抓取它。我正在使用带有 express 和 bodyparser 的 nodejs。
我只想将此数据存储在 JSON 中,不希望此处涉及任何数据库。
我遇到了 writeFile 方法的问题,使用 'fs' 模块。
它可以工作,但它会将新数据推送到我的 JSON 文件的单个数组之外。
你知道我是否可以推入阵列内部吗?类似于 .push 方法,但使用 writeFile/appendFile/wathever 与 [=46 配合使用效果很好=] 文件。
这是我的代码:
app.post(路由器):
app.post('/visitorBook', async (req, res) => {
let formData = {
name: req.body.name,
msg: req.body.msg,
emoji: req.body.emoji
}
try {
console.log(req.body)
let data = JSON.stringify(formData, null, 2);
fs.writeFile("./views/scripts/dataVisitorBook.json", data, { { // dataVisitorBook.json is the storage file
flag:'a' // this flag specify 'please append it' over 'please override file'
}
}, (err) => {
console.log('error :', err)
});
res.redirect('/contact')
} catch (error) {
console.error('/visitorBook route error : ', error)
}
})
我的 JSON :
[
{
"name": "test1",
"msg": "test1",
"emoji": "<i class='fas fa-hippo fa-3x'></i>"
},
{
"name": "test2",
"msg": "test2",
"emoji": "<i class='fas fa-hippo fa-3x'></i>"
}
]
{
"name": "sd",
"msg": "sd",
"emoji": "<i class='fas fa-kiwi-bird fa-3x'></i>"
}
所以最后一个名称和消息中带有“sd”的是推送的。另外2个是我手写的,用于readFile测试。
希望我提供了所有需要的信息。不习惯这里post...
谢谢。
如果您从现有文件中读取并用 JSON.parse
解析它,您将能够在其上实际使用 Array.push
。然后你可以将字符串化的结果写回到文件中:
fs.readFile("./views/scripts/dataVisitorBook.json", function (err, data) {
if (err) throw err;
let data = JSON.parse(data.toString('utf8'));
data = JSON.stringify(data, null, 2);
fs.writeFile("./views/scripts/dataVisitorBook.json", data, { { // dataVisitorBook.json is the storage file
flag:'a' // this flag specify 'please append it' over 'please override file'
}
}, (err) => {
console.log('error :', err)
});
})
它可能不是最佳选择,因为随着文件变大,它可能需要更多时间。
我很欣赏你的简单尝试但是使用一些标准对你来说会更好
Node 有一些标准 JSON 数据库,例如:
Simple JSON DB
Node JSON DB
另外,你可以试试 SQLite
我还尝试使用一个简单的 JSON 文件作为数据库。我面临着很多工作,我也做到了。所以我的建议是使用一些标准库
除此之外,您还必须获取文件数据将其解析为JSON(解码)进行更改并再次序列化并写入文件(编码)。
[已解决]
感谢 @Divarrek ,我已经完成了它的工作。
所以:
使用 fs.readFileSync 读取文件。
然后,我将这个原始数据存储在一个变量中,同时将其解析为 JSON.
然后,我将其推送到 'jsonBook' 变量中,该变量是 json 文件,临时制作成一个简单的 object-variable.
然后我用 writeFile 写入文件,将数据作为变量 'parsed' 传递,其中包含我的 'jsonBook'
的 JSON.stringified 版本
app.post("/visitorBook", async (req, res) => {
let formData = {
name: req.body.name,
msg: req.body.msg,
emoji: req.body.emoji,
};
try {
let rawdata = fs.readFileSync("./views/scripts/dataVisitorBook.json");
var jsonBook = JSON.parse(rawdata);
let formDataParsed = JSON.stringify(formData, null, 2);
jsonBook.push(formData);
let parsed = JSON.stringify(jsonBook, null, 2);
fs.writeFile("./views/scripts/dataVisitorBook.json", parsed, (err) => {
if (err) throw err;
console.log("saved");
});
res.redirect("/contact");
} catch (error) {
console.error("/visitorBook route error : ", error);
}
});
希望我说的很清楚。可能是我解释有误,我尽力了。
我正在执行基本的 'Visitor Book' 功能。
用户可以提交一个小表格(包含三个输入:姓名、消息和表情符号)。
我在我的路由器组件中用 req.body 抓取它。我正在使用带有 express 和 bodyparser 的 nodejs。
我只想将此数据存储在 JSON 中,不希望此处涉及任何数据库。
我遇到了 writeFile 方法的问题,使用 'fs' 模块。
它可以工作,但它会将新数据推送到我的 JSON 文件的单个数组之外。
你知道我是否可以推入阵列内部吗?类似于 .push 方法,但使用 writeFile/appendFile/wathever 与 [=46 配合使用效果很好=] 文件。
这是我的代码:
app.post(路由器):
app.post('/visitorBook', async (req, res) => {
let formData = {
name: req.body.name,
msg: req.body.msg,
emoji: req.body.emoji
}
try {
console.log(req.body)
let data = JSON.stringify(formData, null, 2);
fs.writeFile("./views/scripts/dataVisitorBook.json", data, { { // dataVisitorBook.json is the storage file
flag:'a' // this flag specify 'please append it' over 'please override file'
}
}, (err) => {
console.log('error :', err)
});
res.redirect('/contact')
} catch (error) {
console.error('/visitorBook route error : ', error)
}
})
我的 JSON :
[
{
"name": "test1",
"msg": "test1",
"emoji": "<i class='fas fa-hippo fa-3x'></i>"
},
{
"name": "test2",
"msg": "test2",
"emoji": "<i class='fas fa-hippo fa-3x'></i>"
}
]
{
"name": "sd",
"msg": "sd",
"emoji": "<i class='fas fa-kiwi-bird fa-3x'></i>"
}
所以最后一个名称和消息中带有“sd”的是推送的。另外2个是我手写的,用于readFile测试。
希望我提供了所有需要的信息。不习惯这里post... 谢谢。
如果您从现有文件中读取并用 JSON.parse
解析它,您将能够在其上实际使用 Array.push
。然后你可以将字符串化的结果写回到文件中:
fs.readFile("./views/scripts/dataVisitorBook.json", function (err, data) {
if (err) throw err;
let data = JSON.parse(data.toString('utf8'));
data = JSON.stringify(data, null, 2);
fs.writeFile("./views/scripts/dataVisitorBook.json", data, { { // dataVisitorBook.json is the storage file
flag:'a' // this flag specify 'please append it' over 'please override file'
}
}, (err) => {
console.log('error :', err)
});
})
它可能不是最佳选择,因为随着文件变大,它可能需要更多时间。
我很欣赏你的简单尝试但是使用一些标准对你来说会更好
Node 有一些标准 JSON 数据库,例如: Simple JSON DB Node JSON DB 另外,你可以试试 SQLite 我还尝试使用一个简单的 JSON 文件作为数据库。我面临着很多工作,我也做到了。所以我的建议是使用一些标准库
除此之外,您还必须获取文件数据将其解析为JSON(解码)进行更改并再次序列化并写入文件(编码)。
[已解决]
感谢 @Divarrek ,我已经完成了它的工作。
所以:
使用 fs.readFileSync 读取文件。
然后,我将这个原始数据存储在一个变量中,同时将其解析为 JSON.
然后,我将其推送到 'jsonBook' 变量中,该变量是 json 文件,临时制作成一个简单的 object-variable.
然后我用 writeFile 写入文件,将数据作为变量 'parsed' 传递,其中包含我的 'jsonBook'
app.post("/visitorBook", async (req, res) => {
let formData = {
name: req.body.name,
msg: req.body.msg,
emoji: req.body.emoji,
};
try {
let rawdata = fs.readFileSync("./views/scripts/dataVisitorBook.json");
var jsonBook = JSON.parse(rawdata);
let formDataParsed = JSON.stringify(formData, null, 2);
jsonBook.push(formData);
let parsed = JSON.stringify(jsonBook, null, 2);
fs.writeFile("./views/scripts/dataVisitorBook.json", parsed, (err) => {
if (err) throw err;
console.log("saved");
});
res.redirect("/contact");
} catch (error) {
console.error("/visitorBook route error : ", error);
}
});
希望我说的很清楚。可能是我解释有误,我尽力了。