首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NodeJs流程流程

NodeJs流程流程
EN

Stack Overflow用户
提问于 2018-08-07 15:20:06
回答 1查看 101关注 0票数 0

我最近开始研究nodeJs。但是在单线程概念之间弄混了,因为在不同的页面上使用global或var关键字变量,而这些变量是使用required包含的。下面是我的代码。

代码语言:javascript
复制
    var express = require("express");
    var app = express();
    var mysql = require("mysql");
    var comm_fun = requre("./common_functions");
    var global_res = ''; // variable to send the reponse back to browser from any function
    var global_req = '';// variables to save request data


    app.listen(1234,function(req,res){

        console.log("server started");
        global_res = res;
        global_req = req;
        mysql = '';// code to have mysql connection in this variable
    });

现在,我可以在不同的文件中使用mysql,global_res和global_req变量。但这些是否会影响另一个请求的值,因为它们是全局的。

例如,请求1的"global_req“值为1,

同时请求2也来了

请求%2的"global_req“值为%2

这两个请求是否会在任何时候发生冲突。当第二个请求到达时,可以在任何时间点将"global_req“从1覆盖到2。或者两者都是不同的请求,并且在任何时间点都不会冲突。

谢谢,

EN

回答 1

Stack Overflow用户

发布于 2018-08-07 15:47:59

是的,这里有一个非常简单的场景:

  1. Request 1传入,将全局ID设置为1
  2. Request 1,然后执行一些IO绑定操作(例如,DB
  3. request 2传入并将全局ID设置为2
  4. )。IO绑定操作完成,请求1继续,但现在全局ID为2,而不是1

关于Node单线程的争论仅适用于您的应用程序是纯CPU绑定的情况,然而,如果大多数Node应用程序都是IO绑定的,那么它们就是有效的多线程。问题在于我们不能保证回调返回的顺序,考虑到这一点,创建竞争条件相当简单,例如

代码语言:javascript
复制
let global_id = 0;
...
app.use(() => global_id++);
app.post('/create', async (req, res) => {
  try {
    const exists = db.query(`SELECT id FROM table WHERE id = ${global_id}`);
    if (!exists) {
      db.query(`INSERT INTO ....`);
    }
  } catch (e) {
    return next(e);
  }
});

如果两个请求同时命中/create端点,则两个请求都成功的可能性很小(至少是正确的)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51721029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档