在服务器首次启动时创建一次 JSON 文件
Creating a JSON file once, when the server first starts
我正在尝试创建一个 json 文件一次(服务器首次加载),这样我以后就可以只引用那个 json 文件,而不是每次都渲染那个 JSON用户请求该页面。
我有一个有效的json。我用 firefox 和 here 检查了它,但是当我尝试用 node.js 创建一个文件并且之前检查过 JSON 我得到一个错误。
首先,我创建了它可以工作的文件(它已被填充,但只有第一次使用新文件名,如果我再次使用相同的文件名,文件将是空的...)并且一旦我加载它,这个文件变空了,我得到了那个错误(实际上我不知道什么时候它变空了,这是我的问题我不知道错误在哪里..)。
错误:
module.js:489
throw err;
^
SyntaxError: ...\data\my.json: Unexpected end of input
at Object.parse (native)
at Object.Module._extensions..json (module.js:486:27)
at Module.load (module.js:355:32)
at Function.Module._load (module.js:310:12)
at Module.require (module.js:365:17)
at require (module.js:384:17)
at Object.<anonymous> (...\routes\projects.js:72:14)
at Module._compile (module.js:460:26)
at Object.Module._extensions..js (module.js:478:10)
我正在使用
fs.unlink
和
fs.writeFile
我不明白这是怎么回事,很奇怪...
ps.: 我正在使用 Express.js
问题是在 createDataOnceWhenServerFirstTimeStarts
中创建文件的代码是异步的。因此,当您尝试加载 JSON 时,它可能尚未写入。
如果文件已经存在,还有另一个问题:fs.unlink
也是异步的,您不必等待此步骤完成后再写入文件。
如果这个初始化需要在服务器开始监听之前完成,我建议你只使用同步fs方法:
exports.createDataOnceWhenServerFirstTimeStarts = function () {
var myData = ...;//get data from funciton call
var outputFilename = "data/my.json";
if (fs.existsSync(outputFilename)) {
try {
fs.unlinkSync(outputFilename);
console.log("File deleted successfully!");
} catch (err) {
return console.error(err);
}
} else {
console.log("File does not exist!");
}
var dataToWrite = JSON.stringify(myData);//,null,4);
try {
fs.writeFileSync(outputFilename, dataToWrite);
console.log("JSON saved to " + outputFilename);
} catch (err) {
return console.log(err);
}
};
顺便说一句,您不一定需要先删除(取消链接)该文件,fs.writeFile
如果它存在,将覆盖它。
我正在尝试创建一个 json 文件一次(服务器首次加载),这样我以后就可以只引用那个 json 文件,而不是每次都渲染那个 JSON用户请求该页面。
我有一个有效的json。我用 firefox 和 here 检查了它,但是当我尝试用 node.js 创建一个文件并且之前检查过 JSON 我得到一个错误。
首先,我创建了它可以工作的文件(它已被填充,但只有第一次使用新文件名,如果我再次使用相同的文件名,文件将是空的...)并且一旦我加载它,这个文件变空了,我得到了那个错误(实际上我不知道什么时候它变空了,这是我的问题我不知道错误在哪里..)。
错误:
module.js:489
throw err;
^
SyntaxError: ...\data\my.json: Unexpected end of input
at Object.parse (native)
at Object.Module._extensions..json (module.js:486:27)
at Module.load (module.js:355:32)
at Function.Module._load (module.js:310:12)
at Module.require (module.js:365:17)
at require (module.js:384:17)
at Object.<anonymous> (...\routes\projects.js:72:14)
at Module._compile (module.js:460:26)
at Object.Module._extensions..js (module.js:478:10)
我正在使用
fs.unlink
和
fs.writeFile
我不明白这是怎么回事,很奇怪...
ps.: 我正在使用 Express.js
问题是在 createDataOnceWhenServerFirstTimeStarts
中创建文件的代码是异步的。因此,当您尝试加载 JSON 时,它可能尚未写入。
如果文件已经存在,还有另一个问题:fs.unlink
也是异步的,您不必等待此步骤完成后再写入文件。
如果这个初始化需要在服务器开始监听之前完成,我建议你只使用同步fs方法:
exports.createDataOnceWhenServerFirstTimeStarts = function () {
var myData = ...;//get data from funciton call
var outputFilename = "data/my.json";
if (fs.existsSync(outputFilename)) {
try {
fs.unlinkSync(outputFilename);
console.log("File deleted successfully!");
} catch (err) {
return console.error(err);
}
} else {
console.log("File does not exist!");
}
var dataToWrite = JSON.stringify(myData);//,null,4);
try {
fs.writeFileSync(outputFilename, dataToWrite);
console.log("JSON saved to " + outputFilename);
} catch (err) {
return console.log(err);
}
};
顺便说一句,您不一定需要先删除(取消链接)该文件,fs.writeFile
如果它存在,将覆盖它。