gpt4 book ai didi

javascript - 在nodejs中创建HTTPS api并测试

转载 作者:太空宇宙 更新时间:2023-11-04 02:16:23 25 4
gpt4 key购买 nike

我正在创建一个应该在 https 上运行的 api。我这样创建服务器:

//...
var app = express();
app.use(passport.initialize());

// do config, like app.use(express.bodyParser());, etc

var myController = require('../app/controllers/myController');
app.get('/myApi/', myController.someFunction);

var useHTTPS = true;

if (useHTTPS) {
var https = require('https');
var fs = require('fs');
var options = {
key: fs.readFileSync('./config/key.pem'),
cert: fs.readFileSync('./config/cert.pem')
};
var port = 3443;
https.createServer(options, app).listen(port);
console.log('started HTTPS on port ' + port);
} else {
var port = 3000;
app.listen(port);
console.log('started HTTP on port ' + port);
}

module.exports = app;

有了这个,我就可以通过curl访问api了。然后我安装 mocha 和 supertest 并在一个新的 ./test/test.js 文件中尝试这个,该文件是从几个示例复制的......

var assert = require('assert');    
var request = require('supertest')
, express = require('express');

var app = express();

describe('GET /myApi', function(){
it('respond with json', function(done){
request(app)
.get('/myApi/')
.expect(200, done);
})
})

但是这个测试总是失败,永远不会到达我的 Controller 中的 console.log() 。无论我使用 HTTP 还是 HTTPS,它总是这样响应......

1) GET /myApi respond with json: Error: expected 200 "OK", got 404 "Not Found" at Test._assertStatus (node_modules/supertest/lib/test.js:232:12)

我是否错误地创建了 Express https 应用程序?或者我在测试文件中访问它不正确?

我认为在测试文件中简单地说 app = express(); 看起来是错误的,但是当我尝试从 app.js 获取“真正的”应用程序时,就像这样......

// in ./test/test.js
var app = require("../app.js");

我收到另一个错误,指出该端口已在使用中...

Uncaught Error: listen EADDRINUSE :::3443

我认为这是有道理的。我被困住了。任何帮助将不胜感激!

最佳答案

这是一个最小的工作示例:

app.js:

const express = require("express");
const controller = require("./controller");

const useHTTPS = true;
const app = express();
app.get("/api/", controller.someFunction);

let server;
if (useHTTPS) {
const https = require("https");
const fs = require("fs");
const path = require("path");

const options = {
key: fs.readFileSync(path.resolve(__dirname, "./config/key.pem")),
cert: fs.readFileSync(path.resolve(__dirname, "./config/cert.pem")),
};
const port = 3443;
server = https.createServer(options, app);
server.listen(port);
console.log("started HTTPS on port " + port);
} else {
const port = 3000;
server = app.listen(port);
console.log("started HTTP on port " + port);
}

module.exports = server;

controller.js:

function someFunction(req, res) {
res.sendStatus(200);
}

module.exports = {
someFunction,
};

app.test.js:

const request = require("supertest");
const app = require("./app");

describe("GET /api", function() {
after((done) => {
app.close(done);
});
it("respond with json", function(done) {
request(app)
.get("/api/")
.expect(200, done);
});
});

集成测试结果与覆盖率报告:

started HTTPS on port 3443


GET /api
✓ respond with json


1 passing (37ms)

---------------|----------|----------|----------|----------|-------------------|
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s |
---------------|----------|----------|----------|----------|-------------------|
All files | 88.89 | 50 | 100 | 88.89 | |
app.js | 83.33 | 50 | 100 | 83.33 | 23,24,25 |
app.test.js | 100 | 100 | 100 | 100 | |
controller.js | 100 | 100 | 100 | 100 | |
---------------|----------|----------|----------|----------|-------------------|

错误Uncaught Error: Listen EADDRINUSE:::3443 表示该地址已在使用中。

源代码:https://github.com/mrdulin/mocha-chai-sinon-codelab/tree/master/src/stackoverflow/35559645

关于javascript - 在nodejs中创建HTTPS api并测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35559645/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com