我是Node JS的新手,最近我制作了所有API,这些API完全可以按我的意愿工作。但是,现在我希望其中一些(例如handler.home)也返回静态html模板。但是,现在我得到了如下错误。...
Server.js
const config = require('../config');
//Dependencies
const http = require('http');
const https = require('https');
//file system support to read files
var fs = require('fs');
//path module to access directories
var path = require('path');
var url = require('url');
//importing the handlers
var handlers = require('./handlers');
//importing helpers
var helpers = require('./helpers');
var stringDecoder = require('string_decoder').StringDecoder;
//server object to handle all the tasks
let server = {}
//creating a server from the https module which defines what to do when the server is created
server.httpsServerOptions = {
'key': fs.readFileSync(path.join(__dirname, '/../https/key-pem')),
'cert': fs.readFileSync(path.join(__dirname, '/../https/cert.pem'))
};
//creating a server from the http module which defines what to do when the server is created
server.httpServer = http.createServer(function(req, res){
server.unifiedServer(req, res);
});
server.httpsServer = https.createServer(server.httpsServerOptions, function(req, res){
server.unifiedServer(req, res);
});
server.unifiedServer = function(req,res){
//steps of parsing a user request
//GET the method of request -> get/put/delete/post
var method = req.method.toLowerCase();
//PARSE THE URL / get the url
var parsedUrl = url.parse(req.url, true);
var path = parsedUrl.pathname;
var queryObject = parsedUrl.query;
var trimmedPath = path.replace(/^\/+|\/+$/g, '');
//Read Headers
var urlHeaders = req.headers;
var decoder = new stringDecoder('utf-8');
var bufferPayload = '';
//event handler when some data is recieved in the payload / body
req.on('data', (data) => {
bufferPayload += decoder.write(data);
});
req.on('end', () => {
bufferPayload += decoder.end();
//ROUTE TO A SPECIFIC HANDLER BASED ON ROUTING OBJECT, ROUTE TO NOTFOUND IF NOT FOUND
var selectedHandler = typeof(server.router[trimmedPath]) !== 'undefined' ? handlers[trimmedPath] : handlers.notFound;
//once the handler is specified, we need to send some data to it as expected by the handler
var data = {
'headers': urlHeaders,
'method': method,
'pathname': trimmedPath,
'payload': helpers.convertJSONstr2JSON(bufferPayload),
'queryString': queryObject
}
//send the data and look for callback
selectedHandler(data, (statusCode, payload, contentType) => {
console.log("entered")
//send a default status code of 200 if no status code is defined
statusCode = typeof(statusCode) == 'number' ? statusCode : 200;
//set contentType to json if no contentType is provided for rendering
contentType = typeof(contentType) == 'string' ? contentType : 'json';
if(contentType == 'json'){
res.setHeader('Content-Type', 'application/json');
payload = typeof(payload) == 'object' ? JSON.stringify(payload) : JSON.stringify({});
}
if (contentType == 'html'){
res.setHeader('Content-Type', 'text/html');
payload = typeof(payload) == 'string' ? payload : '';
}
res.writeHead(statusCode);
//SEND THE RESPOSE FROM THE SERVER
res.end(payload);
//LOG IF YOU NEED TO THE CONSOLE
if(statusCode == 200){
//display in green
console.log('\x1b[32m%s\x1b[0m',"response on ", method +" " +trimmedPath, " ->", statusCode);
}
else {
//for any non 200 status, display in red
console.log('\x1b[31m%s\x1b[0m',"response on ", method +" " +trimmedPath, " ->", statusCode);
}
});
});
};
server.router = {
'' : handlers.home,
'account/create': handlers.accountCreate,
'account/edit': handlers.accountEdit,
'account/deleted': handlers.accountDeleted,
'session/create' : handlers.sessionCreate,
'session/deleted' : handlers.sessionDeleted,
'checks/create' : handlers.checksCreate,
'checks/all': handlers.checkList,
'checks/edit': handlers.checksEdit,
'ping': handlers.ping,
'api/users': handlers.users,
'api/tokens': handlers.tokens,
'api/checks': handlers.checks
};
//intitialise the server file
server.init = ()=>{
server.httpServer.listen(config.httpPort, function(){
console.log('\x1b[36m%s\x1b[0m',"the server is listening on port "+config.httpPort + " ["+config.envName+"] ");
});
server.httpsServer.listen(config.httpsPort, function(){
console.log('\x1b[35m%s\x1b[0m',"the server is listening on port "+config.httpsPort + " ["+config.envName+"] ");
});
};
module.exports = server;
handlers.js
/*
*This file stores all the handlers
*
*/
//dependencies
let dataLib = require('./data');
let helpers = require('./helpers');
let config = require('../config');
//main code
let handlers = {};
/*
* HTML API HANDLERS BELOW
*
*/
handlers.home = function(data, callback){
console.log("found index ->", data);
callback(200, 'undefined', 'html');
};
module.exports = handlers;
现在,我要的是能够在contentType为html的情况下进行响应,而它现在无法正常工作。如果我不提供contentType并设置api的行为以返回json,则一切正常。有什么想法吗?