升级Sails从v0.12到v1后PostgreSQL出现Datastore和models未定义错误
这个错误是因为Sails v1对ORM(Waterline)的核心架构做了重大调整,和v0.12的配置逻辑完全不同,导致适配器找不到必填的datastore和models配置。我来一步步帮你解决:
错误原因解析
Sails v0.12里的数据库连接配置直接在config/connections.js里设置,模型默认自动关联;但v1重构后,改用**datastore(数据存储)**来管理数据库连接,并且要求全局或模型级别明确指定datastore,同时全局models配置也必须包含必填项,否则适配器调用find这类方法时就会报错。
具体修复步骤
1. 配置全局Datastore
在config/datastores.js文件中(如果没有就新建一个),添加PostgreSQL的连接配置:
module.exports.datastores = { default: { adapter: 'sails-postgresql', // 可以用URL格式,或者分开配置下面的参数 url: 'postgresql://你的用户名:你的密码@localhost:5432/你的数据库名', // host: 'localhost', // port: 5432, // user: '你的用户名', // password: '你的密码', // database: '你的数据库名' } };
这里的default是默认数据存储,后续模型如果没有单独指定,就会使用这个配置。
2. 配置全局Models默认值
在config/models.js文件中,确保设置了datastore字段:
module.exports.models = { datastore: 'default', // 关联上面配置的默认datastore migrate: 'alter', // 根据你的需求选择:safe(不修改表结构)、alter(自动同步)、drop(每次重启删表重建) // 其他全局模型配置... };
这一步是关键,全局配置会让所有模型默认继承这个datastore设置,避免每个模型都重复写。
3. 检查单个模型的配置(可选)
如果某个模型需要使用单独的datastore,在对应的模型文件(比如api/models/Users.js)里明确指定:
module.exports = { datastore: 'default', // 或者你自定义的其他datastore名称 attributes: { // 你的模型字段定义... } };
4. 验证依赖兼容性
确保你安装的sails-postgresql版本是兼容Sails v1的,建议安装最新的适配版本:
npm install sails-postgresql@latest --save
如果之前有旧版本残留,最好先删除node_modules和package-lock.json,重新安装依赖。
关于你添加的适配器打印
你在node_modules/sails-postgresql/lib/adapter里加的打印可以暂时保留,修复配置后,再次调用find方法时,应该能看到datastore和models参数被正确传入适配器,错误也就会消失了。
内容的提问来源于stack exchange,提问作者George Bell

