Nodejs同步HTTP请求

Posted

技术标签:

【中文标题】Nodejs同步HTTP请求【英文标题】:Nodejs synchronous HTTP request 【发布时间】:2018-12-31 15:22:58 【问题描述】:

例如:考虑 nodejs 中的用户注册 Web 服务。在函数内部,我编写了用于验证 DB 中是否存在电子邮件的代码(整个函数也是使用 asyn await 编写的)。这在一次发出单个请求时有效。当使用相同的 email_id 进行多个注册 api 调用时,此验证将不起作用。请让我知道是否有人以前遇到过类似的问题以及相同的解决方案。

【问题讨论】:

这就是 javascript 单线程异步特性的问题。您可以浏览以下博客文章,这将帮助您解决问题。 mattpalmerlee.com/2014/03/22/a-pattern-for-handling-concurrent 我们该如何解决呢?让它成为多线程的?,如果是这样的话。 如果它对单个请求正常工作,那么它也应该适用于多个。您是否发现它因多个请求而失败,或者这只是您的想法?您能解释一下执行多个 req 时您面临的确切问题吗? 经过适当训练,可以编写可靠的异步代码,同时处理数以亿计的请求。如果您发布了您的实际代码,我们甚至可以在您的上下文中向您展示如何操作。但是,编写一个关于如何在没有任何代码的情况下做到这一点的通用教程超出了堆栈溢出的范围。 node.js 不支持同步网络和为此所需的线程基础设施。如果需要,请选择一种以这种方式工作的语言,例如 Java。或者,学习如何编写适当的异步 Javascript 来解决您的问题。 来自帮助中心:寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及最短的代码有必要在问题本身中重现它。没有明确问题陈述的问题对其他读者没有用处。请参阅:How to create a Minimal, Complete, and Verifiable example。 【参考方案1】:

你的猫鼬模式应该是以下格式:

const User = mongoose.model('User', new Schema(
    firstName:  
        type:String,
        required: true,
    ,
    lastName: 
        type:String,
        required: true,
    ,
    email: 
        type:String,
        required: true,
        unique: true
    ,

));

如果您尝试使用同一电子邮件进行第二次注册,这将引发错误E11000 duplicate key error。您需要在响应中处理此错误,以通知用户具有特定 email 的帐户已存在。

【讨论】:

我想要一些其他的解决方案,比如同步 http 请求和数据库级别的阻塞/验证 同步 HTTP 请求会影响您的后端性能。如果您同步进行注册请求,则在此期间将不允许进行其他注册请求。以其他方式,您还可以使用某种数据结构来保存您的电子邮件 ID 注册请求,并且您可以对照它检查每个请求。但这有时也会面临类似的问题。我仍然不赞成从代码中处理这个而不是使用数据库约束。而且我不知道您希望从代码中处理它的原因是什么。

以上是关于Nodejs同步HTTP请求的主要内容,如果未能解决你的问题,请参考以下文章

记阿里面试的一道nodejs中http同步处理请求问题

记阿里面试的一道nodejs中http同步处理请求问题

NodeJS 等待 HTTP 请求

如何使用 NodeJS 同步运行两个函数?

发送 HTTP/2 POST 请求 NodeJS

如何使用NodeJS连接从请求中提取请求http标头