Javascript 我想用我的server.js中req.body的新数据填充employeeData
我想使用函数参数从函数中填充req.body,以执行更新,但它不起作用。下面是我的代码 data-service.jsJavascript 我想用我的server.js中req.body的新数据填充employeeData,javascript,node.js,Javascript,Node.js,我想使用函数参数从函数中填充req.body,以执行更新,但它不起作用。下面是我的代码 data-service.js var employees = []; //Here is a function that populate the employees array function initialize() { return new Promise((resolve, reject) => { fs.readFile('./data/employees.json
var employees = [];
//Here is a function that populate the employees array
function initialize() {
return new Promise((resolve, reject) => {
fs.readFile('./data/employees.json', (err, data) => {
if (err) {
reject(err);
} else {
try {
employees = JSON.parse(data);
resolve(employees);
} catch (err) {
reject('Unable to read file');
}
}
});
fs.readFile('./data/departments.json', (err, data) => {
if (err) {
reject(err);
} else {
try {
departments = JSON.parse(data);
resolve(departments);
} catch (err) {
reject('Unable to read file');
}
}
});
});
};
如果id与数组中员工的id匹配,则此函数将执行更新
function updateEmployee(employeeData) {
return new Promise((resolve, reject) => {
try {
const newData = [];
employees.forEach((element) => {
if (element.employeeNum == employeeData.employeeNum) {
//Here I want to populate the employeeData with the new data from req.body in my server.js
}
});
} catch (error) {
reject(error);
}
});
}
这里是在server.js中处理更新的路由
app.post('/employee/update', (req, res) => {
dataService.updateEmployee(req.body).then(function(data) {
res.redirect("/employees");
}).catch((err) => {
console.log(err);
});
});
/在这里,我想用我的server.js中req.body的新数据填充employeeData
那没有道理req.body
是进入服务器的请求的主体。使用employeeData
中的数据修改employeeData
(您在employees
数组中拥有的对象)是有意义的,但不是相反。比如:
function updateEmployee(employeeData) {
// Not clear why you're using a promise here, but I assume it's to
// emulate some storage update that would be asynchronous...
return new Promise((resolve, reject) => {
try {
const newData = [];
for (const employee of employees) {
if (employee.employeeNum == employeeData.employeeNum) {
// Perhaps
employeePropertyNames.forEach(name => {
// There may be a couple you want
if (employeeData.hasOwnProperty(name)) {
element[name] = employeeData[name];
}
});
// Or: Object.assign(employee, employeeData); -- But NOT A GOOD IDEA
resolve(employee);
break;
}
}
} catch (error) {
reject(error);
}
});
}
…其中employeePropertyNames
是您希望允许通过客户端请求更新的员工属性名称的列表
使用blind
Object.assign
不是一个好主意,因为它允许客户端请求进行它想要的任何更改(包括添加全新的属性),其中可能有些东西(如employeeNum
)不应该更改。什么不起作用?目前,您只是在搜索员工,但不必搜索任何与接收到的数据有关的内容。此外,您的承诺永远不会解决,因此您的路由永远不会到达res.redirect()
此外,您的初始化有一个竞争条件。您有一个承诺,但您正在异步读取两个文件。其中一个文件将首先处理,然后承诺解决(无论是与员工还是部门,无论是先完成的)或拒绝。您将无法获得另一个文件的解析或拒绝。我建议使用类似于Promise.all()
的方法,并使每个文件的初始化成为自己的承诺。谢谢。它成功了,我得到了你的解释,我已经重构了我的代码以更好地工作。