0

我用 Node.js 对 Angular Universal 项目中的 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 似乎不会等待从请求中接收数据到数据库。

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

4

2 回答 2

0

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

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

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 的版本,我有服务器渲染或与数据库的工作连接。不是同时两个。如果有人知道该怎么做,我将不胜感激。谢谢你。

于 2017-03-08T07:44:33.040 回答
0

正确的方法

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);
    });
  });
});
于 2017-03-07T12:18:23.517 回答