发送电子邮件时的 Nodejs 事件循环
Nodejs eventloop when sending an email
我是 Nodejs 的新手,一直在使用 Express 框架构建 Web 应用程序。在应用程序中,我在有人成功付款后创建收据,我想通过电子邮件将收据发送给他们。
最好的方法是什么?我在想,在用户对 /payment 执行 post 之后,我可以将他们重新路由到一个通过电子邮件发送电子邮件的端点,然后再次将它们重新路由到 /receipt 以显示收据。或者我可以在 /payment 中执行此操作,但这会阻止任何内容并使其变慢,使用 Stripe 结帐并将所有内容添加到数据库已经需要几秒钟。
尽管我已经阅读了很多相关内容,但我并不完全理解整个事件循环概念。我了解回调和所有这些,但不确定为什么它不会阻止事件循环?回调可以和其他函数同时执行吗?我认为这将帮助我理解发送电子邮件的最佳行动方案,具体取决于这是否会阻止任何事情并使其更加延迟。感谢所有帮助,感谢任何可以帮助像我这样的初学者理解这些超级重要的 Node 概念的人。谢谢。
你的问题并没有提供太多关于你的网络应用程序的见解,但我在这里提到了一些对 Node.js 的初学者来说非常重要的要点。
- Node.js提出事件驱动编程的概念,因为只有一个
单线程正在接受客户端连接和
跟踪回调(例如可能在调用堆栈中)。
- 但事实是Node.js并不是单线程实现的。每当出现 http 连接时,都会自动为与之关联的任何 cpu 绑定操作分配 4 个线程。
- 通常,所有 i/o 绑定操作都有与之关联的回调。因此,主循环一直在等待事件(比如 i/o 绑定操作的完成,例如 读取文件的结束 ),并且每当此循环触发回调检测到任何此类事件。现在,这个主线程负责这个回调。
- 虽然回调和事件似乎彼此非常相似,但还是有细微差别,即
使用异步函数的结果调用回调,如下面的代码
var fs = require("fs");
fs.readFile('input.txt', function (err, data) {
if (err) return console.error(err);
console.log(data.toString());
});
console.log("Program Ended");
但事件循环实际上是在寻找任何事件的发生,而不是寻找回调等所有情况的结果。事件可能类似于打开文件或关闭文件。下面给出了事件的常见用例:
// Import events module
var events = require('events');
// Create an eventEmitter object
var eventEmitter = new events.EventEmitter();
// Create an event handler as follows
var connectHandler = function connected() {
console.log('connection succesful.');
// Fire the data_received event
eventEmitter.emit('data_received');
}
// Bind the connection event with the handler
eventEmitter.on('connection', connectHandler);
// Bind the data_received event with the anonymous function
eventEmitter.on('data_received', function(){
console.log('data received succesfully.');
});
// Fire the connection event
eventEmitter.emit('connection');
console.log("Program Ended.");
关于以上几点的详细说明,请再次阅读 Node.js 文档。
我是 Nodejs 的新手,一直在使用 Express 框架构建 Web 应用程序。在应用程序中,我在有人成功付款后创建收据,我想通过电子邮件将收据发送给他们。
最好的方法是什么?我在想,在用户对 /payment 执行 post 之后,我可以将他们重新路由到一个通过电子邮件发送电子邮件的端点,然后再次将它们重新路由到 /receipt 以显示收据。或者我可以在 /payment 中执行此操作,但这会阻止任何内容并使其变慢,使用 Stripe 结帐并将所有内容添加到数据库已经需要几秒钟。
尽管我已经阅读了很多相关内容,但我并不完全理解整个事件循环概念。我了解回调和所有这些,但不确定为什么它不会阻止事件循环?回调可以和其他函数同时执行吗?我认为这将帮助我理解发送电子邮件的最佳行动方案,具体取决于这是否会阻止任何事情并使其更加延迟。感谢所有帮助,感谢任何可以帮助像我这样的初学者理解这些超级重要的 Node 概念的人。谢谢。
你的问题并没有提供太多关于你的网络应用程序的见解,但我在这里提到了一些对 Node.js 的初学者来说非常重要的要点。
- Node.js提出事件驱动编程的概念,因为只有一个 单线程正在接受客户端连接和 跟踪回调(例如可能在调用堆栈中)。
- 但事实是Node.js并不是单线程实现的。每当出现 http 连接时,都会自动为与之关联的任何 cpu 绑定操作分配 4 个线程。
- 通常,所有 i/o 绑定操作都有与之关联的回调。因此,主循环一直在等待事件(比如 i/o 绑定操作的完成,例如 读取文件的结束 ),并且每当此循环触发回调检测到任何此类事件。现在,这个主线程负责这个回调。
- 虽然回调和事件似乎彼此非常相似,但还是有细微差别,即 使用异步函数的结果调用回调,如下面的代码
var fs = require("fs");
fs.readFile('input.txt', function (err, data) {
if (err) return console.error(err);
console.log(data.toString());
});
console.log("Program Ended");
但事件循环实际上是在寻找任何事件的发生,而不是寻找回调等所有情况的结果。事件可能类似于打开文件或关闭文件。下面给出了事件的常见用例:
// Import events module
var events = require('events');
// Create an eventEmitter object
var eventEmitter = new events.EventEmitter();
// Create an event handler as follows
var connectHandler = function connected() {
console.log('connection succesful.');
// Fire the data_received event
eventEmitter.emit('data_received');
}
// Bind the connection event with the handler
eventEmitter.on('connection', connectHandler);
// Bind the data_received event with the anonymous function
eventEmitter.on('data_received', function(){
console.log('data received succesfully.');
});
// Fire the connection event
eventEmitter.emit('connection');
console.log("Program Ended.");
关于以上几点的详细说明,请再次阅读 Node.js 文档。