Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 指定了与sslrootcert连接的Pg Promise问题_Node.js_Postgresql_Ssl_Digital Ocean_Pg Promise - Fatal编程技术网

Node.js 指定了与sslrootcert连接的Pg Promise问题

Node.js 指定了与sslrootcert连接的Pg Promise问题,node.js,postgresql,ssl,digital-ocean,pg-promise,Node.js,Postgresql,Ssl,Digital Ocean,Pg Promise,我在尝试连接到Digital Ocean上的托管数据库时遇到问题,该数据库的sslmode=require 我使用的连接字符串如下所示: postgresql://username:password@server:port/mydb?sslmode=require 我的db.js文件如下所示: "use strict"; const fs = require('fs') const pgPromise = require("pg-promise"); c

我在尝试连接到Digital Ocean上的托管数据库时遇到问题,该数据库的sslmode=require

我使用的连接字符串如下所示:

postgresql://username:password@server:port/mydb?sslmode=require
我的db.js文件如下所示:

"use strict";
const fs = require('fs')
const pgPromise = require("pg-promise");
const {ConnectionString} = require('connection-string');
const path = require('path');

var options = {
// Initialization Options
};
let pgp = pgPromise(options);

const dotenv = require('dotenv');
dotenv.config();

const a = new ConnectionString('postgresql://username:password@server:port/mydb?sslmode=require')

var cert= fs.readFileSync(__dirname + '/certs/ca-certificate.crt', 'utf8')
a.setDefaults({   
    params: {
        sslrootcert : cert
    }
});

var connstring = a.toString();
let dbpool = pgp(connstring);
module.exports = { dbpool };
当我开始这个过程时,一切似乎都很顺利,但当我尝试访问数据库时,我得到:

Error: ENOENT: no such file or directory, open 'C:\Users\Me\Documents\GitHub\tester\-----BEGIN CERTIFICATE----- certificate info -----END CERTIFICATE-----
如果我将pgp连接改为接受ConnectionString对象 如。
设dbpool=pgp(a)然后我似乎与服务器连接,但出现身份验证错误。使用
let dbpool=pgp(a)
将连接字符串更改为指向本地数据库会导致出现奇怪的错误,例如列不存在。但是用
let dbpool=pgp(connstring)指向本地似乎工作正常。因此,我假设需要使用
let dbpool=pgp(connstring)

我的其他相关代码(这只是一个连接到托管数据库的简单测试项目)如下所示:

postgresql://username:password@server:port/mydb?sslmode=require
routes/index.js

"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
  return new (P || (P = Promise))(function (resolve, reject) {
      function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
      function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
      function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
      step((generator = generator.apply(thisArg, _arguments || [])).next());
  });
};
const userrepository_1 = require("../repositories/userrepository");
var express = require('express');
var router = express.Router();

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express' });
   });

/* HIT DATABASE. */
router.get('/testdb',  (req, res) => __awaiter(void 0, void 0, void 0, function* () {

  let userRepos = new userrepository_1.UserRepository();
    let userid = yield userRepos.getuserbyusername("myusername");
    
    if (userid == null) {
        return res.status(404).send({ auth: false, message: 'No user found' });
    }
  res.render('dbtest', { userid: userid });
}))

module.exports = router;
repositories/userrepository.js

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const dbProvider = require("../db");

class UserRepository {
    constructor() {
        this.db = dbProvider.dbpool;
    }

    getuserbyusername(username) {
        return new Promise((resolve, reject) => { resolve(this.db.oneOrNone('SELECT * FROM users 
where isdeleted=false AND username=$1', [username])); })
        .then((user) => {
            if (user != null) {
            
               let uid = user.userid;
            
                return uid;
            }
            else {
                return null;
            }
        });
    }
}
exports.UserRepository = UserRepository;
我的目录结构是:

/bin
    www
/certs
    ca-certificate.crt
/node_modules
/public
/repositories
    userrepository.js
/routes
    index.js
/views
app.js
db.js

就像我说的,我认为问题在于
let dbpool=pgp(connstring)

好的,这是一个简单的修复方法。我只需要指定位置,而不是使用
const cert=fs.readFileSync(\uu dirname+'/certs/ca certificate.crt','utf8')
读取文件。因此:

const path=require('path');
const cs=新连接字符串('postgresql://username:password@服务器:port/mydb?sslmode=require');
const sslrootcert=path.join(uu dirname,'ca certificate.crt');
cs.setDefaults({
参数:{sslrootcert}
});
const db=pgp(cs.toString());

(我还将证书移动到了我的主目录)

我还必须通过npm更新pg promise。(发现我的主项目仍然无法使用新的db.js-正在关闭SSL消息。必须进行更新)。