gpt4 book ai didi

javascript - 尝试使用 node.js 模块 'replace-in-file' 来查找和替换文件中的多个字符串

转载 作者:行者123 更新时间:2023-11-29 23:55:56 27 4
gpt4 key购买 nike

我正在为我的 node.js 项目使用“替换文件”模块。我已经将下面的 Node 模块和 app.js 文件编写为 (1) 从网页获取表单数据,(2) 从模板创建一个新文件,(3) 遍历数据对象中的每个键/值对,( 4) 对于每个键值对,在新文件中搜索与该键匹配的字符串并替换为该键对应的值,(5) 将新文件的名称返回给客户端。

当应用程序运行时,会创建一个新文件,但新文件中反射(reflect)的唯一搜索和替换似乎是 最后 搜索和替换由 .forEach() 循环运行。

为什么我的所有搜索和替换都没有显示在新文档中?

这是我编写的名为 make-docs.js 的模块:

var fs = require('fs');
var replace = require('replace-in-file');
var path = require('path');

// function to build agreement file
exports.formBuild = function(data){

var fileName = data.docType + Date.now() + '.html';
var filePath = __dirname + '/documents/' + fileName;

// make a new agreement
fs.createReadStream(data.docType + '.html').pipe(fs.createWriteStream(filePath));

Object.keys(data).forEach(function(key){

var options = {
//Single file
files: filePath,
//Replacement to make (string or regex)
replace: key,
with: data[key].toUpperCase(),
//Specify if empty/invalid file paths are allowed, defaults to false.
//If set to true these paths will fail silently and no error will be thrown.
allowEmptyPaths: false,
};
replace(options)
.then(changedFiles => {
console.log('Modified files:', changedFiles.join(', '));
console.log(options);
})
.catch(error => {
console.error('Error occurred:', error);
});
})
}
var express = require("express");
var fs = require("fs");
var bodyParser = require("body-parser");
var makeDocs = require("./make-docs.js");
var path = require('path');
var app = express();

app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
app.use('/documents', express.static(path.join(__dirname, 'documents')));

app.post("/docs", function(req, res) {
console.log(req.body);
res.send(makeDocs.formBuild(req.body));
});

app.listen(8080,function(){
console.log("Node server listening on port 8080");
});

最佳答案

这是因为您同步触发多个替换,而它们在后台异步发生。所以发生的情况是,每个替换操作都会读取文件内容,这些内容在开始时是不变的,然后进行替换,但只有一个替换被保存到文件中(最后一个)。

要避免设置中的这个特殊问题,可以通过 replace.sync API 使用同步替换:

try {
let changedFiles = replace.sync(options);
console.log('Modified files:', changedFiles.join(', '));
}
catch (error) {
console.error('Error occurred:', error);
}

但是请注意,在进行所有替换时,这将阻止脚本的执行(并减慢您的请求)。对于小文件和很少的替换,这应该不是问题,但对于较大的文件和更多的替换,它可能是。因此,建议使用后台进程来进行这些替换,但这超出了本答案的范围。

replace-in-file 包尚不支持您进行多个不同替换的用例,但我已经添加了此功能,因为它看起来很有用。

现在您可以一次进行多个替换(同步或异步):

const replaceInFile = require('replace-in-file');

const replace = [/replace/g, /also/g];
const with = ['something', 'else'];
const files = [...];

replaceInFile({files, replace, with})
.then(changedFiles => { ... })
.catch(error => { ... });

您可以使用键/值对填充对象中的replacewith 数组。如果要用相同的替换替换多个值,可以使用字符串进行 replace

希望这对您有所帮助。

为了完整起见,以下是您将如何逐个系列地异步处理替换:

const Promise = require('bluebird');
const replace = [/replace/g, /also/g];
const with = ['something', 'else'];
const file = '...';

Promise
.map(replace, (replacement, i) => {
return replaceInFile({
files: file,
replace: replacement,
with: with[i],
});
})
.then(() => {
//read file now which will contain all replaced contents
});

请注意,这是一个简化的示例,并假定 replacewith 数组的大小相同。查看 Bluebird 库,了解有关如何在串行/并行等中使用 promises 的更多详细信息。

关于javascript - 尝试使用 node.js 模块 'replace-in-file' 来查找和替换文件中的多个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41707945/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com