NodeJS 앱의 기본 URL을 설정할 수 있습니까?
하위 도메인 (예 : images.google.com 대신 google.com/reader)을 사용하지 않고 동일한 도메인에서 여러 NodeJS 앱을 호스팅 할 수 있기를 원합니다. 문제는 Express / NodeJS에서 "/ reader"와 같은 URL의 첫 부분을 항상 입력한다는 것입니다.
기본 URL이되도록 Express 앱을 설정하려면 어떻게해야 something.com/myapp
합니까?
그래서 대신 :
app.get("/myapp", function (req, res) {
// can be accessed from something.com/myapp
});
내가 할 수있는:
// Some set-up
app.base = "/myapp"
app.get("/", function (req, res) {
// can still be accessed from something.com/myapp
});
또한 Connect의 staticProvider가 동일한 방식으로 작동하도록 구성하고 싶습니다 (현재 정적 파일을으로 something.com/js
또는 something.com/css
대신 제공하는 것이 기본값 입니다 something.com/myapp/js
).
현재이 기능은 지원되지 않으며 직접 추가하는 것도 쉽지 않습니다.
전체 라우팅 항목은 서버 코드 내부에 깊숙이 묻혀 있으며 보너스로 자신의 경로가 노출되지 않습니다.
소스를 파헤 치고 최신 버전의 Express 및 Connect 미들웨어도 확인했지만 아직 이러한 기능에 대한 지원이 없으므로 Connect 또는 Express 자체 에서 문제를 열어야 합니다.
그 동안에...
직접 패치하십시오. 한 줄의 코드 만 변경하면 빠르고 쉬운 방법이 있습니다.
에서 다음 ~/.local/lib/node/.npm/express/1.0.0/package/lib/express/servers.js
을 검색합니다.
// Generate the route
this.routes[method](path, fn);
이것은 line 주위에 있어야합니다 357
.
// Generate the route
this.routes[method](((self.settings.base || '') + path), fn);
이제 설정을 추가하십시오.
app.set('base', '/myapp');
이것은 일반 문자열 인 경로에서 잘 작동합니다. RegEx 지원을 위해서는 라우터 미들웨어를 직접 해킹해야하며이 경우 문제를 더 잘 제출해야합니다.
정적 공급자에 관한 한, /mypapp
설정할 때 추가하십시오 .
최신 정보
RegExp에서도 작동하도록 만들었습니다.
// replace
this.routes[method](baseRoute(self.settings.base || '', path), fn);
// helper
function baseRoute(base, path) {
if (path instanceof RegExp) {
var exp = RegExp(path).toString().slice(1, -1);
return new RegExp(exp[0] === '^' ? '^' + base + exp.substring(1) : base + exp);
} else {
return (base || '') + path;
}
}
나는 이것을 몇 가지 표현으로 만 테스트했기 때문에 100 % 테스트되지는 않았지만 이론적으로는 작동합니다.
업데이트 2
패치 관련 문제 제출 :
https://github.com/visionmedia/express/issues/issue/478
익스프레스 라우터는 4.0부터이를 처리 할 수 있습니다.
http://expressjs.com/en/api.html#router
http://bulkan-evcimen.com/using_express_router_instead_of_express_namespace.html
var express = require('express');
var app = express();
var router = express.Router();
// simple logger for this router's requests
// all requests to this router will first hit this middleware
router.use(function(req, res, next) {
console.log('%s %s %s', req.method, req.url, req.path);
next();
});
// this will only be invoked if the path ends in /bar
router.use('/bar', function(req, res, next) {
// ... maybe some additional /bar logging ...
next();
});
// always invoked
router.use(function(req, res, next) {
res.send('Hello World');
});
app.use('/foo', router);
app.listen(3000);
이전 답변 (Express 4.0 이전) :
트릭을 수행하는 데 사용 된 익스프레스 네임 스페이스 모듈 (지금은 죽었 음) :
https://github.com/visionmedia/express-namespace
require('express-namespace');
app.namespace('/myapp', function() {
app.get('/', function (req, res) {
// can be accessed from something.com/myapp
});
});
스레드를 업데이트하기 위해 이제 Express.js
v4 에서는 다음을 사용하지 않고도 할 수 있습니다 express-namespace
.
var express = require('express'),
forumRouter = express.Router(),
threadRouter = express.Router(),
app = express();
forumRouter.get('/:id)', function(req, res){
res.send('GET forum ' + req.params.id);
});
forumRouter.get('/:id/edit', function(req, res){
res.send('GET forum ' + req.params.id + ' edit page');
});
forumRouter.delete('/:id', function(req, res){
res.send('DELETE forum ' + req.params.id);
});
app.use('/forum', forumRouter);
threadRouter.get('/:id/thread/:tid', function(req, res){
res.send('GET forum ' + req.params.id + ' thread ' + req.params.tid);
});
forumRouter.use('/', threadRouter);
app.listen(app.get("port") || 3000);
건배!
I was able to achieve this using a combination of express-namespace for the routes and a fix from the below google group discussion for the static assets. This snippet will treat a request to /foo/javascripts/jquery.js like a request to /javascripts/jquery.js:
app.use('/foo', express.static(__dirname + '/public'));
Source: https://groups.google.com/forum/#!msg/express-js/xlP6_DX6he0/6OTY4hwfV-0J
There are also reliability issues. If reliability is important, a common solution is to use a front-end reverse HTTP proxy such as nginx or HAProxy. They both use single-thread evented architecture and are thus very scalable.
Then you can have different node processes for different subsites, and if one site fails (uncaught exception, memory leak, programmer error, whatever) the rest of sub-sites continue to work.
I was looking for this feature but for API routes, not for static files. What I did was that when I initialized the router, I added the mount path. So my configuration looks like this
//Default configuration
app.configure(function(){
app.use(express.compress());
app.use(express.logger('dev'));
app.set('json spaces',0);
app.use(express.limit('2mb'));
app.use(express.bodyParser());
app.use('/api', app.router); // <---
app.use(function(err, req, res, callback){
res.json(err.code, {});
});
});
Notice the '/api' when calling the router
I know this is a very old question but Express has changed a lot since most these answers were posted so I thought I'd share my approach.
You can, of course, use Routers with Express 4 to group together related functionality behind a particular path. This is well documented and has already been covered by other answers.
However, it is also possible to mount an entire application at a particular path. As an example, let's assume our application (the one we want to host at /myapp
) looks like this, in a file called myapp.js
:
var express = require('express'),
path = require('path'),
app = express();
app.use(express.static(path.join(__dirname, 'public')));
app.get('/hello', function(req, res) {
res.send('Hello');
});
// Lots of other stuff here
exports.app = app;
In our main js file we could then mount this whole application at the path /myapp
:
var express = require('express'),
app = express(),
myApp = require('./myapp').app;
app.use('/myapp', myApp);
app.listen(3000);
Note that we've created two applications here, one mounted on the other. The main application could have further sub-apps mounted at different paths as required.
The code in myapp.js
is completely independent of where it was mounted. It's similar to the structure used by the express-generator
in that regard.
Some documentation about sub-apps can be found here:
https://expressjs.com/en/4x/api.html#app.mountpath https://expressjs.com/en/4x/api.html#app.onmount
참고URL : https://stackoverflow.com/questions/4375554/is-it-possible-to-set-a-base-url-for-nodejs-app
'IT박스' 카테고리의 다른 글
py.test 내부 지원 중단 경고를 억제하는 방법 (0) | 2020.12.10 |
---|---|
돌아가서 SVN 체크인에 대한 설명을 편집 할 수 있습니까? (0) | 2020.12.10 |
파일 입력을 지우는 방법 (0) | 2020.12.10 |
jQuery.ajax 및 FormData를 사용하여 파일을 업로드하는 방법 (0) | 2020.12.10 |
하나의 표현식에서 하나의 문자열을 여러 값과 비교 (0) | 2020.12.10 |