【问题标题】:Parsing url params in expressjs - angularjs application在 expressjs 中解析 url 参数 - angularjs 应用程序
【发布时间】:2013-12-26 09:30:54
【问题描述】:

在 expressjs 和 AngularJs 项目中遇到路由问题。

它不是一个单页应用程序,我没有使用任何视图引擎,例如jade。

我们只是使用纯 HTML。

我正在开发密码重置功能,用户可以通过单击电子邮件提供的链接来重置密码。所以我假设在 Angular 的上下文中不会有任何路由更改事件(如果我错了,请纠正我)。

而我的快递配置如下。

routes = require('./routes/index');    
app.configure(function () {
    app.use(express.static(__dirname + '/app'));
    app.use('/css', express.static(__dirname + '/app/css'));
    app.set('views', __dirname + '/app');
    app.set("view options", { layout: false });
    app.engine('.html', require('ejs').__express);
    app.set('view engine', 'html');
    app.use(express.favicon());
    //app.use(require('connect').bodyParser());
    app.use(express.bodyParser());
    app.use(express.methodOverride());

    app.use(app.router);

});


// Routes

app.get('/', routes.index);

app.get('/resetpassword.html/:resetcode', function (req, res) {
    console.log("reset code: " + req.params.resetcode);
    res.render('resetpassword.html/' + req.params.resetcode);
});

app.get('/api', function (req, res) {
    res.send('Ecomm API is running');
});

// JSON API
app.post('/registeruser', usersApi.registerUser);
app.post('/api/login', usersApi.logIn);
app.post('/api/addgame', gamesApi.addGame);

app.get('*', routes.index);

// Start server

app.listen(2221, function () {
    console.log("Express server listening on port %d in %s mode", 2221, app.settings.env);
});

和 index.js

exports.index = function(req, res){
  res.render('home.html');
}; // Always rending index.html which needs to be fixed.

和来自AnghularJs的app.js如下

app.config(function ($routeProvider) {
    $routeProvider
      .when('/', { templateUrl: 'home.html' })
      .when('/resetpassword.html/:resetcode', { templateUrl: '/resetpassword.html', controller: 'ResetPasswordCtrl' })
      .otherwise({ redirectTo: '/' });
});

我收到 500 个内部错误或查看未找到错误。

请有任何建议。

【问题讨论】:

    标签: node.js angularjs express routing


    【解决方案1】:

    您将密码连接到您传递给render 的视图名称,因此 Express 找不到该视图并返回 500 错误。您需要将数据作为附加参数作为对象传递给render 函数:

    res.render('resetpassword.html', {resetcode: req.params.resetcode} );
    

    然后在您看来直接使用resetcode,例如

    <span><%= resetcode %></span>
    

    【讨论】:

    • 感谢您的回复。我们不能从视图中访问参数,而是从控制器中读取它吗?
    • 也许可以,但这与模板渲染无关。如果 url 是 /resetpassword.html/1234 那么我猜 Angular 控制器将能够读取它,但你不需要将它传递给服务器端 node.js render 函数。 IMO 您不应该在服务器端和客户端都进行路由,就像在服务器端进行路由一样,Angular 端的路由似乎是多余的。顺便说一句,如果可以解决您的问题,请将答案标记为已接受;)
    • 再次感谢。但是经过上述更改后,我没有收到任何错误。但我看不到网址。我只能看到楼主。有什么想法吗?
    • 我想我已经解决了另一个修改 url 的问题。我有一个客户端路由,它将路由设置为“/”。仍在尝试弄清楚如何在 Angular 端获取参数。
    • 我也是这么想的。正如我所说,您可能不应该在 Angular 端使用路由。只需分别为每个 Teamplate 提供相应的控制器代码。还请将答案标记为已接受,因为它解决了您的问题;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-08
    • 2016-08-15
    • 1970-01-01
    • 2013-07-01
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    相关资源
    最近更新 更多