我想使用node-postgres模块在postgres中创建一个"预备语句".我想创建它而不将其绑定到参数,因为绑定将在循环中进行.
在我阅读的文档中:
query(object config, optional function callback) : Query
If _text_ and _name_ are provided within the config, the query will result in the creation of a prepared statement.
Run Code Online (Sandbox Code Playgroud)
我试过了
client.query({"name":"mystatement", "text":"select id from mytable where id=$1"});
Run Code Online (Sandbox Code Playgroud)
但是当我尝试只传递配置对象中的文本和名称键时,我得到一个例外:
(已翻译)消息绑定0参数但预准备语句需要1
有什么我想念的吗?如何在不将其绑定到特定值的情况下创建/准备语句,以避免在循环的每个步骤中重新准备语句?
console.log像这样输出,
{ [error: syntax error at or near "step"]
length: 86,
name: 'error',
severity: 'ERROR',
code: '42601',
detail: undefined,
hint: undefined,
position: '62',
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
file: 'scan.l',
line: '1001',
routine: 'scanner_yyerror' }
Run Code Online (Sandbox Code Playgroud)
但是JSON.stringify没有看到错误的叙述部分,
{ "长度":86, "名称": "错误", "严重性": "ERROR", "代码": "42601", "位置": "62", "文件": "scan.l里","行 ":" 1001" , "常规": "scanner_yyerror"}
我无法弄清楚如何得到这个"错误:列'未定义’不存在"读书wikies(https://github.com/brianc/node-postgres/wiki/Error-handling,HTTP://的NodeJS. ru/doc/v0.4.x/stdio.html#console.log)
代码是这样的,
client.query(selstring, function(err, result) {
if(err){
res.send(JSON.stringify(err));
console.log(err);
}else{
Run Code Online (Sandbox Code Playgroud)
谢谢
更新:err.toString()显示error: syntax error at or near "step"
我最近从MySQL切换到postgres作为node.js项目的数据库.虽然我能够从我的本地pgAdmin III(OSX)客户端访问我的远程postgres数据库,但到目前为止我一直无法通过node.js连接到我的数据库.我确信我为pgAdmin和我的node.js输入的凭据完全相同.我尝试过的另一件事是在我的数据库服务器的pg_hba.conf中设置我的本地ipadress而不是md5.有什么我做错了吗?我最喜欢的搜索引擎提出了一些关于重置我的本地操作系统的令人担忧的命中.我刚刚使用了node-postgres的github repo doc中的示例:
var pg = require('pg');
var conString = "postgres://myusername:mypassword@hostname:5432/dbname";
var client = new pg.Client(conString);
client.connect(function(err) {
if(err) {
return console.error('could not connect to postgres', err);
}
client.query('SELECT NOW() AS "theTime"', function(err, result) {
if(err) {
return console.error('error running query', err);
}
console.log(result.rows[0].theTime);
client.end();
});
});
Run Code Online (Sandbox Code Playgroud)
这些是我每次尝试启动服务器时遇到的错误:
could not connect to postgres { [Error: getaddrinfo ENOTFOUND] code: 'ENOTFOUND', errno: 'ENOTFOUND', syscall: 'getaddrinfo' }
Run Code Online (Sandbox Code Playgroud)
非常感谢帮助
我想宣传node-postgres的pg.connect方法以及connection.query回调中提供的内部方法.
我可以.promisify后者,但我需要手动实现第一个(如果我在这里遗漏了一些东西,请解释).
问题是,我不确定这段代码是否正确或是否应该改进?代码正在运行,我只是想知道我是否正在使用Bluebird.
// aliases
var asPromise = Promise.promisify;
// save reference to original method
var connect = pg.connect.bind(pg);
// promisify method
pg.connect = function (data) {
var deferred = Promise.defer();
connect(data, function promisify(err, connection, release) {
if (err) return deferred.reject(err);
// promisify query factory
connection.query = asPromise(connection.query, connection);
// resolve promised connection
deferred.resolve([connection,release]);
});
return deferred.promise;
};
Run Code Online (Sandbox Code Playgroud) 这个错误在Windows机器上似乎很常见,但我的Amazon Linux EC2实例在我执行时抛出此错误npm install pg:
../src/binding.cc:1:23: fatal error: pg_config.h: No such file or directory
#include <pg_config.h>
^
compilation terminated.
make: *** [Release/obj.target/binding/src/binding.o] Error 1
make: Leaving directory `/home/ec2-user/macros/test/stateHash/node_modules/pg/build'
gyp ERR! build error
gyp ERR! stack Error: `make` failed with exit code: 2
gyp ERR! stack at ChildProcess.onExit (/usr/lib/node_modules/node-gyp/lib/build.js:267:23)
gyp ERR! stack at ChildProcess.EventEmitter.emit (events.js:98:17)
gyp ERR! stack at Process.ChildProcess._handle.onexit (child_process.js:807:12)
gyp ERR! System Linux 3.4.82-69.112.amzn1.x86_64
gyp ERR! command "node" "/usr/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "rebuild"
gyp ERR! cwd /home/ec2-user/macros/test/stateHash/node_modules/pg
gyp ERR! node …Run Code Online (Sandbox Code Playgroud) 出于实际原因,例如在使用PDO的php中,我经常在准备SQL查询时为参数命名。
那么我可以在node-postgres模块中使用命名参数吗?
现在,我在互联网上看到许多示例和文档,它们显示了如下查询:
client.query("SELECT * FROM foo WHERE id = $1 AND color = $2", [22, 'blue']);
Run Code Online (Sandbox Code Playgroud)
但这也正确吗?
client.query("SELECT * FROM foo WHERE id = :id AND color = :color", {id: 22, color: 'blue'});
Run Code Online (Sandbox Code Playgroud)
或这个
client.query("SELECT * FROM foo WHERE id = ? AND color = ?", [22, 'blue']);
Run Code Online (Sandbox Code Playgroud)
我问这个问题是因为$n在动态构建查询的情况下,带编号的参数对我没有帮助。
简而言之,我无法通过利用Postgresql,Node.js和node-postgres的数据API每分钟支持超过5000个读取请求.瓶颈似乎介于API和DB之间.以下是详细信息.
我正在使用AWS Postgresql RDS数据库实例(m4.4xlarge - 64 GB内存,16个vCPU,350 GB SSD,没有预配置IOPS)用于Node.js支持的数据API.默认情况下,RDS的max_connections = 5000.节点API在两个集群之间进行负载平衡,每个集群有4个进程(2个Ec2,其中4个vCPU运行API,集群模式下为PM2).我使用node-postgres将API绑定到Postgresql RDS,并尝试使用它的连接池功能.下面是我的连接池代码示例:
var pool = new Pool({
user: settings.database.username,
password: settings.database.password,
host: settings.database.readServer,
database: settings.database.database,
max: 25,
idleTimeoutMillis: 1000
});
/* Example of pool usage */
pool.query('SELECT my_column FROM my_table', function(err, result){
/* Callback code here */
});
Run Code Online (Sandbox Code Playgroud)
使用此实现并使用负载测试器进行测试,我可以在一分钟内支持大约5000个请求,平均响应时间约为190毫秒(这是我所期望的).每当我每分钟发出超过5000个请求时,我的响应时间会在最好的情况下增加到超过1200毫秒,在最糟糕的情况下,API开始经常超时.监控表明对于运行Node.js API的EC2,CPU利用率仍低于10%.因此,我的重点是数据库和API与数据库的绑定.
我试图增加(并减少)node-postgres"max"连接设置,但API响应/超时行为没有变化.我也尝试过在RDS上配置IOPS,但没有改进.另外,有趣的是,我将RDS扩展到m4.10xlarge(160 GB内存,40个vCPU),虽然RDS CPU利用率大幅下降,但API的整体性能却大幅下降(甚至无法支持每分钟5000个请求)我能用较小的RDS).
我在许多方面处于不熟悉的领域,并且不确定如何在每分钟超过5000个请求时最好地确定哪些移动部件是瓶颈API性能.如上所述,我已根据对Postgresql配置文档和node-postgres文档的审核尝试了各种调整,但无济于事.
如果有人有关于如何诊断或优化的建议我会非常感激.
在扩展到m4.10xlarge之后,我执行了一系列的负载测试,改变了每个池中请求/分钟数和最大连接数.以下是监控指标的一些屏幕截图:
我一直在使用老式 JavaScriptconst var = require('var').编写我的大部分 API,现在我正在使用ES6 语法编写我的第一个 API,包括使用 import 而不是 require。我总是使用 node-postgres 模块,const {Pool} = require('pg')但是当我尝试编写它时import {Pool} from 'pg'出现错误
SyntaxError: The requested module 'pg' does not provide an export named 'Pool'.
同样,import Pool from 'pg'给我
TypeError: Pool is not a constructor
有没有办法将它作为 ES6 模块导入,或者我是否需要为我的 ES6 postgres 连接找到另一个包?我在网上找不到任何使用 node-postgres 和导入的人的例子。
我正在尝试 GitHub Codespaces,尝试使用 Node 和 Postgres 启动一个应用程序。
\n\n产生以下结果devcontainer.json:
// Update the VARIANT arg in docker-compose.yml to pick a Node.js version: 10, 12, 14 \n{\n "name": "Node.js & PostgreSQL",\n "dockerComposeFile": "docker-compose.yml",\n "service": "app",\n "workspaceFolder": "/workspace",\n\n // Set *default* container specific settings.json values on container create.\n "settings": { \n "terminal.integrated.shell.linux": "/bin/bash",\n "sqltools.connections": [{\n "name": "Container database",\n "driver": "PostgreSQL",\n "previewLimit": 50,\n "server": "localhost",\n "port": 5432,\n "database": "postgres",\n "username": "postgres",\n "password": "postgres"\n }]\n },\n\n // Add the IDs …Run Code Online (Sandbox Code Playgroud) 我目前正在使用 node-postgres 来创建我的池。这是我当前的代码:
const { Pool } = require('pg')
const pgPool = new Pool({
user: process.env.PGUSER,
password: process.env.PGPASSWORD,
host: process.env.PGHOST,
database: process.env.PGDATABASE,
port: process.env.PGPORT,
ssl: {
rejectUnauthorized: true,
// Would like to add line below
// ca: process.env.CACERT,
},
})
Run Code Online (Sandbox Code Playgroud)
我发现了另一篇文章,他们使用“fs”在证书中读取内容,如下所示。
const config = {
database: 'database-name',
host: 'host-or-ip',
user: 'username',
password: 'password',
port: 1234,
// this object will be passed to the TLSSocket constructor
ssl: {
ca: fs.readFileSync('/path/to/digitalOcean/certificate.crt').toString()
}
}
Run Code Online (Sandbox Code Playgroud)
我无法做到这一点,因为我正在使用 git 来部署我的应用程序。特别是 Digital Oceans 新的应用程序平台。我曾尝试联系他们,但没有成功。我不想将我的证书提交到我的源代码管理中。看到很多帖子都建议设置
ssl : { …Run Code Online (Sandbox Code Playgroud) node-postgres ×10
node.js ×10
postgresql ×5
amazon-ec2 ×1
api ×1
aws-rds ×1
bluebird ×1
codespaces ×1
es6-modules ×1
javascript ×1
linux ×1
promise ×1
sql ×1
ssl ×1