【问题标题】:Async Node.js requests in Angular Universal. Server rendering stops workingAngular Universal 中的异步 Node.js 请求。服务器渲染停止工作
【发布时间】:2017-03-08 15:45:19
【问题描述】:

我在 Angular Universal 项目中使用 Node.js 对 MySQL 数据库做了一个简单的请求。

router.route('/newvideos')
          .get(function(req, res) {

            var mysql = require('mysql');

            var connection = mysql.createConnection({
              host     : 'localhost',
              user     : 'root',
              password : 'root',
              database : 'myDB',
              port: '8889'
            });

            connection.connect(function(err) {
              if (err) {
                console.log("Error connecting to DB: " + err);
                throw err;
              }
            });

            connection.query("SELECT * FROM table", function(err, rows, fields) {
              if (err) {
                console.log("Error executing query: " + err);
                throw err;
              }

              connection.end();

              setTimeout(function() {
                res.json(rows);
              }, 0);
         });

     })

我收到了数据,但是它没有出现在 HTML 模板中。我只看到:

<!--template bindings={}-->

似乎 Angular Universal 并没有等待从请求中接收数据到数据库。

如果有人知道如何解决此问题,我将不胜感激。 谢谢。

【问题讨论】:

  • 我认为应该在connection.connect的回调中调用connection.query

标签: mysql node.js asynchronous angular-universal


【解决方案1】:

正确的方法

router.route('/newvideos').get(function(req, res) {
  var mysql = require('mysql');

  var connection = mysql.createConnection({
    host     : 'localhost',
    user     : 'root',
    password : 'root',
    database : 'myDB',
    port: '8889'
  });

  connection.connect(function(err) {
    if (err) {
      console.log("Error connecting to DB: " + err);
      throw err;
    } 

    connection.query("SELECT * FROM table", function(err, rows, fields) {
      if (err) {
        console.log("Error executing query: " + err);
        throw err;
      }
      connection.end();

      return res.json(rows);
    });
  });
});

【讨论】:

  • 谢谢。但是它并不能解决问题。
【解决方案2】:

我发现服务器渲染停止工作不是由于异步请求。就我而言,这取决于 Zone.js。

在这种情况下,我安装了 Zone.js,当我收到警告时 Angular 会询问它:

angular2-universal@2.1.0-rc.1 requires a peer of zone.js@~0.6.21 but none was installed. 

所以我安装了正确的 Zone.js:

npm install zone.js@0.6.21

这个安装的原因是我发现没有它,所有对 MySQL 的请求都不会进行。发生错误。

安装正确的 Zone.js 后,我能够从 MySQL 获取数据。

但是!我发现在这种情况下服务器渲染停止工作。即使我在未连接到数据库的情况下返回 JSON 数据,它也不起作用。

所以我做了一些测试,发现如果我执行以下命令:

npm install zone.js

然后,如果我只返回 JSON 数据而不连接到 MySQL,则服务器渲染工作正常。但是在这种情况下连接数据库时会出现以下错误:

TypeError: Cannot read property 'on' of undefined
        at Protocol._enqueue (/Applications/MAMP/htdocs/Angular2/myproject/node_modules/mysql/lib/protocol/Protocol.js:152:5)
...

现在取决于 Zone.js 的版本,我有服务器渲染或与数据库的工作连接。不是同时两个。如果有人知道该怎么做,我将不胜感激。谢谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-27
    • 2021-06-11
    • 2018-06-14
    • 2021-11-01
    • 2017-11-22
    • 1970-01-01
    • 2018-05-10
    • 2017-08-02
    相关资源
    最近更新 更多