我有以下代码,该代码应该使用对象键值调用api,然后打开一个文本文件,并将与键匹配的文本替换为API数据。为简化起见,我删除了API,使其仅循环通过它们的obj键,然后尝试替换。
// This is the problematic call. If I explicitly set
// product = null, the test runs normally
try {
const product = await Product.findById(req.params.id)
if (!product) {
errors.push({ status: 404, message: "Product not found" })
return next()
}
} catch (err) {
return next(err)
}
数据库/存储段如下所示:
const fs = require('fs')
const storage = require('./db/storage')
const keys = Object.keys(storage.MOVIES);
for (const key of keys) {
fs.readFile('./db/movies_prebuilt.txt', 'utf8', function (err,data) {
if (err) {
return console.log(err);
}
//THIS LINE DOESNT WORK using key. but does work using an actual
string.
var result = data.replace(key, "NOTWORKING");
fs.writeFile('./movies.md', result, 'utf8', function (err) {
if (err) return console.log(err);
});
});
}
里面的替换文本看起来像这样
exports.MOVIES = {
"Matrix_Score": "tt0133093",
"2001_Space_Score": "tt0062622"
...
}
并且我已经将for循环更改为 ### Matrix_Score
,并且工作得很好。不能将密钥用作字符串吗?我要使用它的唯一原因是,这样我就不必再用所有名称编写另一个数组或对象了。
欢呼!
答案 0 :(得分:1)
我认为以下代码可能更接近我所理解的意图。 fs.readFile
返回所有文件内容,您可能想替换键的 all ,而不仅仅是最后一个。也无需多次读取文件:
const fs = require('fs')
const storage = require('./db/storage')
const keys = Object.keys(storage.MOVIES);
fs.readFile('./db/movies_prebuilt.txt', 'utf8', function (err,data) {
if (err) {
return console.log(err);
}
for (const key of keys) {
data = data.toString().replace(key, "NOTWORKING");
}
fs.writeFile('./movies.md', data, 'utf8', function (err) {
if (err) return console.log(err);
});
});
编辑以添加回原始点
fs.readFile
通常返回一个需要.toString
操纵的缓冲区。