【问题标题】:How do I get Sails.js to query an existing database?如何让 Sails.js 查询现有数据库?
【发布时间】:2015-08-28 05:54:43
【问题描述】:

已经为另一个项目设置了一个开发数据库。我正在尝试创建一个sails.js 服务器来连接到这个数据库并充当一个RESTful API。我还使用SQL Workbench 和下面的配置文件连接到数据库并验证我的查询语句。在该工具上,我可以发送select top 10 * from advisor 之类的查询并获得我期望的响应数据。

我在sails.js 中的连接配置似乎没问题,因为我能够启动服务器。我已经得到了简单的静态动作,比如hi: function (req, res) { return res.send("Hi there!"); }。但是,我不知道该怎么做才能从sails 服务的数据库中获得响应。我的目标(此时)是让http://localhost:1337/advisorselect top 10 * from advisor 的结果返回 JSON。

我最初尝试使用新生成的模型。然后,我尝试向模型文件添加属性。然后,我尝试将自己的代码添加到控制器中。在每种情况下,浏览器都没有收到响应。最后,我测试了/advisor/list 来运行我自己的代码,它看起来好像从未执行过 query() 回调。如果这是第一个问题,我已经运行 npm install sails-sqlserver 并仔细检查了我的主机、数据库、用户名和密码是否与 Workbench 中使用的相同。

connections.js

sqlserver: {
  adapter: 'sails-sqlserver',
  user: 'myusername',
  password: 'mypassword',
  host: 'mysubdomain.mydomain.net:1433',
  database: 'frontofficedev'
}

models.js

module.exports.models = {
  connection: 'sqlserver',
  migrate: 'safe'
};

api\models\Advisor.js

module.exports = {
  attributes: {
    advcode: 'string',
    advname: 'string',
    'adv-default': 'boolean',
    "user-id": 'string',
    "pc-code": 'string',
    "adv-tag": 'string',
    "is-group": 'boolean',
    "trade-grouping": 'string',
    AdvisorId: 'int',
    orgcode: 'string',
    BranchId: 'int',
    OrdPrnBranchId: 'int',
    zdec1: 'float',
    zdec2: 'float',
    zchar1: 'string',
    zchar2: 'string',
    zchar3: 'string',
    zchar4: 'string',
    AdvStatus: 'string'
  }
};

api\控制器

module.exports = {
  hi: function (req, res) {
    return res.send("Hi there!");
  },
  list: function (req, res) {
    var myQuery = "select TOP 10 * from advisor";

    sails.log.debug("Query :", myQuery);

    console.log(Advisor);

    Advisor.query(myQuery, function (err, advisors){
      console.log(advisors);
      console.log(err);
      if(err || !advisors.rows.length){
        return res.json({"status": 0, "error": err});
      }
      else{
        return res.json(advisors);
      }
    });
  }
};

关于我做错了什么有什么想法吗? JDBC 是否会导致问题?提前致谢。

【问题讨论】:

  • this 是朝着正确方向迈出的一步吗?

标签: sql-server node.js jdbc sails.js waterline


【解决方案1】:

我假设你已经运行了:npm installsails-sqlserver --save

您必须指定您将在模型中使用的连接和表,模型中的变量应与您的数据库变量匹配,如下所示:

api\models\Advisor.js

    module.exports = {
    schema: true,
    connection: 'sqlserver',
    tableName: 'yourTableName',
    attributes: {
    advcode:{
       type: 'string',
       primaryKey: true //if this is a primary key
    }, 
    advname:{
       type: 'string'
    },
    'adv-default':{
       type: 'boolean'
  }
};

在您的控制器中,您可以像这样使用 Sails ORM 水线:

api\控制器

module.exports = {
  list: function (req, res) {
    Advisor.query('SELECT * FROM advisor', function(err, results) {
      if (err) {
        res.send(400);
      } else {
        res.send(results);
      }
    });
  }
};

Advisor 是模型。

有关模型和 ORM 水线的更多具体信息,我建议您阅读sails 文档:http://sailsjs.org/documentation/reference/waterline-orm/models

【讨论】:

  • 是的,我一直在阅读该文档,但我还没有尝试设置 schema 和 tableName;谢谢。不幸的是,您的更改给了我与以前相同的结果:在 query() 中定义的回调永远不会被执行。 (这是在填写attributes 以匹配数据库并更正控制器底部的右括号之后。)
【解决方案2】:

我的同事发现了问题。数据库所在的端口需要是sails 的connection.js 中的一个单独属性(而不是将其包含在主机字符串中)。不需要额外的库,比如 node-jdbc。

config/connections.js

sqlserver: {
  adapter: 'sails-sqlserver',
  user: 'myusername',
  password: 'mypassword',
  host: 'mysubdomain.mydomain.net',
  port: 1433,
  database: 'frontofficedev'
}

进行该更改后,我能够从控制器中删除所有自定义代码以及从模型中删除几乎所有内容(我仍然需要指定主键,因为sails 默认查找id 并且数据库正在使用AdvisorId.

api/models/Advisor.js

module.exports = {
  attributes: {
    AdvisorId: {primaryKey: true}
  }
};

【讨论】:

    猜你喜欢
    • 2013-08-05
    • 2017-02-18
    • 2019-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-27
    • 2013-06-11
    相关资源
    最近更新 更多