gpt4 book ai didi

javascript - Node.js表单提交异步错误反馈?

转载 作者:太空宇宙 更新时间:2023-11-04 02:19:23 24 4
gpt4 key购买 nike

异步功能使 Node.js 真正强大且快速。但是,假设您正在使用 Express 之类的工具制作 Web 应用程序,并且您有一个表格供访问者填写。提交表单后,它会将数据通过电子邮件发送给某人,并将数据保存到数据库中。

现在有了 Node,我的第一 react 是做这样的事情(伪代码):

sendEmailToSomeone(data, function(err, success){
if (err) { ... }
// email sent successfully
});

insertIntoDatabase(data, function(err, success){
if (err) { ... }
// successful database insertion
});

res.redirect('/thank-you'); // Redirect user to "Thank you" page

因此,您有 2 个异步函数同时发生,发送电子邮件并将数据放入数据库。当这些事情发生在服务器上时,访问者被重定向到某种“感谢您提交表单”页面。这利用了 Node.js 异步功能。

但是,如果这 2 个异步函数之一出现错误,您该怎么办?可能是邮件发送失败或者数据库服务器离线?由于访问者已被重定向,您如何向访问者提供错误反馈?

您是否使用 Promises 或其他东西并强制访问者等待两个异步函数完成,然后再向他们提供“谢谢”消息或“提交表单时出错”消息?如果您采用这种方法,那么您首先就会失去使用 Node.js 的异步优势,并且本质上是在模拟 PHP 类型的响应。

最好的方法是什么?

最佳答案

所有可能的答案都会有某种程度的偏差,所以我解释一下我的,到目前为止我所看到的,主要是使用适当的库来控制异步代码执行,例如 AsyncQ 。特别是 Async.seq 可以以一种优雅的方式帮助您。库中的示例:

// Requires lodash (or underscore), express3 and dresende's orm2.
// Part of an app, that fetches cats of the logged user.
// This example uses `seq` function to avoid overnesting and error
// handling clutter.
app.get('/cats', function(request, response) {
var User = request.models.User;
async.seq(
_.bind(User.get, User), // 'User.get' has signature (id, callback(err, data))
function(user, fn) {
user.getCats(fn); // 'getCats' has signature (callback(err, data))
}
)(req.session.user_id, function (err, cats) {
if (err) {
console.error(err);
response.json({ status: 'error', message: err.message });
} else {
response.json({ status: 'ok', message: 'Cats found', data: cats });
}
});
});

但你可能会发现这个简单且不够 Shiny 或不合适。然后你可以使用Promises 。在你的场景中 Promise.All 会很好。库中的示例:

Promise.all([Promise.resolve('a'), 'b', Promise.resolve('c')])
.then(function (res) {
assert(res[0] === 'a')
assert(res[1] === 'b')
assert(res[2] === 'c')
})

关于javascript - Node.js表单提交异步错误反馈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34206492/

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