使用对象键作为变量替换文件中的文本

时间:2019-03-01 00:31:12

标签: javascript node.js

我有以下代码,该代码应该使用对象键值调用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 ,并且工作得很好。不能将密钥用作字符串吗?我要使用它的唯一原因是,这样我就不必再用所有名称编写另一个数组或对象了。

欢呼!

1 个答案:

答案 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操纵的缓冲区。