Travis CI技术问询:.travis.yml连接PostgreSQL及测试数据库报错排障
咱们一步步拆解你的问题——这是Travis CI搭配PostgreSQL时很常见的坑,我来帮你理清楚:
关于
cannot read property 'statusCode' of undefined 错误与数据库URL配置 首先,你的推测完全正确:这个错误大概率是因为测试时接口请求无法连接数据库,导致返回的response对象为undefined,进而访问response.statusCode时抛出异常。
你需要指定数据库URL吗?
必须要指定。Travis官方说“所有服务使用默认设置”,指的是PostgreSQL服务本身会以默认参数启动(比如默认用户postgres、无密码、默认端口5432),但你的Node.js应用并不知道这些默认参数,必须通过环境变量把连接信息传递给它。
你可以在.travis.yml的env字段里添加数据库连接URL,格式如下:
env: - NODE_ENV="test" DATABASE_URL="postgres://postgres@localhost:5432/travis_ci_test"
如果你的应用是用分开的环境变量(比如DB_USER、DB_NAME、DB_HOST)来配置数据库,也可以分别设置:
env: - NODE_ENV="test" DB_USER="postgres" DB_NAME="travis_ci_test" DB_HOST="localhost" DB_PORT="5432"
关键是要和你应用代码里读取的配置变量名完全对应。
修正你的
.travis.yml配置 当前你的配置有两个小问题:
before_script里的第二个psql命令引号格式错误,会导致脚本执行失败- 缺少数据库连接的环境变量,应用无法正确连接数据库
修正后的完整配置如下:
language: node_js node_js: - "stable" env: - NODE_ENV="test" DATABASE_URL="postgres://postgres@localhost:5432/travis_ci_test" services: - postgresql install: - npm ci cache: directories: - "$HOME/.npm" before_script: # 创建测试数据库 - psql -c 'CREATE DATABASE travis_ci_test;' -U postgres # 执行SQL脚本初始化表结构(修正了命令格式) - psql -U postgres -d travis_ci_test -f ./testdb/teamwork.sql script: - npm test
关键细节说明:
services: - postgresql:告诉Travis启动PostgreSQL服务before_script中的SQL命令:确保先创建数据库,再执行初始化脚本,注意命令参数的顺序(-d指定数据库,-f指定脚本文件)- 环境变量
DATABASE_URL:让你的应用在测试环境下能直接读取到正确的数据库连接地址
额外提醒:确保应用代码读取环境变量
最后要确认你的测试代码/应用配置里,是从环境变量中读取数据库连接信息的。比如如果用Knex.js,你的knexfile.js的test环境应该是:
module.exports = { test: { client: 'postgresql', connection: process.env.DATABASE_URL, // 其他配置... } };
如果是原生的pg模块,连接代码应该是:
const { Pool } = require('pg'); const pool = new Pool({ connectionString: process.env.DATABASE_URL, });
内容的提问来源于stack exchange,提问作者Uwem Uke
相关产品推荐
相关产品推荐

