Javascript expressnodejs中的HTTP请求
我有以下代码来自: 转到Javascript expressnodejs中的HTTP请求,javascript,node.js,http,express,Javascript,Node.js,Http,Express,我有以下代码来自: 转到localhost:8080/hola,它不会加载本地主机:8080工作正常self.init()。问题似乎是以下调用的函数: Server.prototype.initMiddleware = function() { var self = this , conf = this.conf; this.use(function(req, res, next) { var setHeader = res.setHeader; res.set
localhost:8080/hola
,它不会加载<代码>本地主机:8080工作正常self.init()。问题似乎是以下调用的函数:
Server.prototype.initMiddleware = function() {
var self = this
, conf = this.conf;
this.use(function(req, res, next) {
var setHeader = res.setHeader;
res.setHeader = function(name) {
switch (name) {
case 'Cache-Control':
case 'Last-Modified':
case 'ETag':
return;
}
return setHeader.apply(res, arguments);
};
next();
});
this.use(function(req, res, next) {
return self._auth(req, res, next);
});
this.use(term.middleware());
this.use(this.app.router);
this.use(express.static(__dirname + '/../static'));
};
根据express.js
文档:
// a middleware sub-stack which prints request info for any type of HTTP request to /user/:id
app.use('/user/:id', function(req, res, next) {
console.log('Request URL:', req.originalUrl);
next();
}, function (req, res, next) {
console.log('Request Type:', req.method);
next();
});
因此,第一个app.get
和其他app.use之间似乎存在“冲突”。请使用或this.use
。我如何解决这个问题呢?这是因为您没有返回任何内容,然后浏览器会对此进行轮询,直到它返回一些内容
this.app.get("/hola", function(req, res) {
res.writeHead(200, {'content-type':'text/html'});
res.end('/*html code here*/');
});
self.init()
在app.get(…)
外部调用时返回很多东西self.init()。最后,我得到一个输出。问题是,对于app.get
,它不起作用。@user2979409“self.init()
返回很多东西”它不起作用,因为它没有return
语句。它可能会将大量内容打印到控制台,或执行许多其他副作用操作,但它不会返回任何内容。函数表达式调用(如self.init()
的值是被调用函数的返回值。@apsillers,如果没有返回任何内容,为什么我会在浏览器中看到“打印”的bash控制台?(self.init
调用外部app.get(…)
。我想要的是调用self.init
或调用app.get('/',function(){self.init()});
的相同输出。
我不同意。但我认为在这种情况下,我看不到这些方法在做什么,因为您没有设置它们:if(this.conf.localOnly)this.initLocal();this.initMiddleware();this.initRoutes();this.initIO()
@user2979409函数的return
值与打印到控制台的副作用有什么关系?如果不调用return
,则没有定义的return
值。可以在函数中调用console.log
,而不在该函数中调用return
。(例如,定义一个函数:function foo(){console.log(“我是一个日志语句!”);}
,然后调用它:var result=foo();
当您记录result
的值时,请注意它是未定义的
。返回值与函数所做的任何其他事情无关。)你真的只想让localhost:8080/hola
像localhost:8080/
一样工作吗?你可以简单地将static/index.html
复制到static/hola
中,然后将索引文件复制到另一个文件中。Express服务器直接从/static>提供终端应用程序的静态html代码>文件夹;您正在修补的服务器端逻辑只指定如何响应来自静态HTML客户端的请求,而不是如何将基本客户端代码发送到浏览器。为了帮助您了解实际问题,self.init()
这里设置了服务器端逻辑。基本上,您这样做是为了在主页(/
)工作之前需要访问/hola
,但是访问/hola
本身不做任何其他事情(除了使应用程序工作)。只是这不是真的,因为您已经运行了self.init()
在app.get('hola')
监听器之外(使用iniciar()
),所以访问/hola
完全没有任何作用。@apsillers,关于您的评论,您建议this.get(“/”,函数(res){iniciar();})
和删除self.init
外部app.get
会起作用。但它不是。执行此操作:1.将代码放回找到它的方式(现在)。您不需要更改服务器端逻辑来完成所需的操作,并且在您的安装程序正常运行之前,此表单可能会停止工作。2.将static/index.html
复制到一个新文件中,static/hola
。3.在浏览器中加载localhost:8080/hola
。好的,@apsillers,它不起作用。我的目标是设置此应用程序的更安全登录,例如。因此,当登录成功时,我需要passport使用get
重定向用户。
this.app.get("/hola", function(req, res) {
res.writeHead(200, {'content-type':'text/html'});
res.end('/*html code here*/');
});