node.js - 更新文件中的内容后读取文件
问题描述
我在 Node JS 中创建了如下三种方法
function UpdateJson(reqData){
let rawdata = fs.readFileSync('someData.json');
let data = JSON.parse(rawdata);
Object.keys(data).forEach(function(key) {
data[key] = reqData[key];
});
fs.truncateSync('someData.json', 0, function(){});
let jstrData = JSON.stringify(data);
fs.writeFileSync('someData.json', jstrData, function(){});
}
function CreateThemeScss(jFile){
fs.createReadStream(jFile)
.pipe(jsonSass({
prefix: '$theme: ',
}))
.pipe(fs.createWriteStream('sData.scss'));
}
function ExecuteCmd(){
exec('node-sass sData.scss styles.css');
var rdata = fs.readFileSync('styles.css').toString();
return rdata;
}
我在 app.post 方法中以相同的顺序调用这些方法。我在响应中发回了rdata
fromExecuteCmd
方法的返回值。
我看到每次我rdata
从ExecuteCmd
方法调用 API 时都是一样的。我希望上述这些方法同步执行,以便CreateThemeScss
仅在UpdateJson
完成后执行并且ExecuteCmd
必须仅在CreateThemeScss
完成后执行,以便我在响应中获得更新rdata
。
欢迎任何形式的帮助
解决方案
首先,您需要Stream NodeJS 文档。
我从你的问题中了解到的是CreateThemeScss
函数调用保持异步,因为jsonSass
给你一个stream
对象。
但是您似乎想CreateThemeScss
在执行之前等待流结束ExecuteCmd
。
如果这是问题,我们可以这样做:
function UpdateJson(reqData) {
const rawdata = fs.readFileSync('someData.json');
let data = JSON.parse(rawdata);
Object.keys(data).forEach(function(key) {
data[key] = reqData[key];
});
// fs.truncateSync('someData.json', 0, function(){});
// is wrong called, see https://nodejs.org/dist/latest-v8.x/docs/api/fs.html#fs_fs_ftruncatesync_fd_len
fs.truncateSync('someData.json', 0);
const jstrData = JSON.stringify(data);
// fs.writeFileSync('someData.json', jstrData, function(){});
// is wrong called, see https://nodejs.org/api/fs.html#fs_fs_writefilesync_file_data_options
fs.writeFileSync('someData.json', jstrData);
}
function CreateThemeScss(jFile) {
return new Promise((resolve, reject) => {
const readStream = fs.createReadStream(jFile);
readStream.on('error', reject);
readStream.on('end', resolve);
readStream
.pipe(jsonSass({
prefix: '$theme: ',
}))
.pipe(fs.createWriteStream('sData.scss'));
}
}
function ExecuteCmd() {
exec('node-sass sData.scss styles.css');
// return rdata
return fs.readFileSync('styles.css').toString();
}
并这样称呼它:
...
UpdateJson("{'test':'test'}");
await CreateTheme(dJson.json);
var a = ExecuteCmd();
...
推荐阅读
- php - Cakephp 2.x 在没有模型的控制器中设置自定义验证消息
- azure - 用于监控的遥测与组织洞察
- c# - 如何做自动大小的分组框?
- gutenberg-blocks - Gutenberg is not saving my custom block data
- php - 使用控制台安装 SDK
- python - AWS region in AWS Glue
- oracle - ORACLE SQL ORA-00918: 查询时列定义不明确
- rxjs - 在 Angular6 服务中使用 EventEmitter
- reactjs - react js中的导出函数
- sql - 检查从第二个位置开始的另一列值中是否存在列值sql server