节点/快速 - 路径/功能难题 - 循环参考

时间:2016-12-04 02:09:06

标签: node.js function express routes

更聪明的程序员,请指教:

  1. 来自AJAX帖子的两个变量(用户名,图片)
  2. 从req.body
  3. 获取路线users.js
  4. 将我的功能放在 main.Funcs 文件中,导出到 server.js
  5. 我无法弄清楚如何从我的路径和我的server.js中获取变量,以便我可以将它们与我的函数一起使用。如果没有循环'要求'路由和mainFunc之间

    问题:

    如何在没有(1)制作全局变量的情况下从路径访问变量,在路由和mainFuncs之间也没有(2)循环要求?

    可以设置全局变量但不好吗?有一种方法可以在一个大的函数中调用它们,这些函数可以在不创建全局的情

    server.js

    var express = require('express');
    var mainFuncs = require('./mainFunctions.js');
    
    mainFuncs.startServer();
    mainFuncs.sqlConnectionCheck();
    mainFuncs.learnFace(username, picLink);
    

    mainFuncs.js

    const client = some api methods, input from route --> api --> json back
    var express = require('express');
    var users = require('./routes/users');
    var bodyParser = require('body-parser');
    app.use('/users', users);
    var app = express();
    app.use(bodyParser.urlencoded());
    app.use(bodyParser.json());
    app.use(express.static('public'));
    app.use('/', main);
    app.use('/users', users);
    app.use('/profile', profile);
    
    var mainFuncs = {
    startServer: function () {
        app.listen(3000, function() {
          models.users.sync({ force: true });
          models.userPicData.sync({ force: true });
          console.log('Listening on port 3000!');
          });
        },
    sqlConnectionCheck: function (){
        sequelize
        .authenticate()
        .then(function(err) {
          console.log('Connection to mysql: success.');
        })
        .catch(function (err) {
          console.log('Connection to mysql: failed with these errors: ', err);
        });
        },
    learnFace: function (username, picPath) {
          client.faces.detect({ urls: picPath, attributes: 'all' })
          .then(function(result){
              var newLearn = JSON.parse(result);
              var newTid = newLearn.photos[0].tags[0].tid;
              var fullNameSpace = username + '@notARealNameSpace';
              console.log('You have been registered with the name: ' + username);
              client.tags.save(newTid, fullNameSpace, {label: nameString, password: 'optionalPassword'});
              client.faces.train(nameString, { namespace: 'urface' });
              })
          },
      };
    module.exports = mainFuncs;
    

    路由/ users.js

    var express = require('express');
    var router = express.Router();
    var bodyParser = require('body-parser');
    var app = express();
    
    router.post('/create', function(req,res){
      var username = req.body.username;
      var picLink = req.body.pic;
      });
    
    module.exports = router;
    

1 个答案:

答案 0 :(得分:1)

通常,快速应用程序的结构使得Business Logic,Routes和Express服务器位于不同的位置。应用程序的实际逻辑进入目录/lib。您的路线位于/routes内,而您的server.js会进入您的项目根目录。

/<root>
  /lib
  /public
  /routes
  server.js
  package.json
  

你的意思是我的mainFuncs应该导入路由器吗?看起来我当时正在编写路线中的大部分程序?

不,您的逻辑会进入/lib内的单独文件,而您的/routes会在必要时需要它。这种方法是分离的,允许您的逻辑生活在您的路线之外。如果需要,逻辑可以在多个路由中实现,但是集中且易于维护。这使您的路由可以自由地仅实现确定响应和更新会话状态所需的代码。

上面的代码可以这样构成:

server.js

const express = require('express');
const bodyParser = require('body-parser');
const users = require('./routes/users');

// Place DB and any other initialization here in server.js
// so it will be guaranteed to execute prior to the server listening

const app = express();
const port = process.env.PORT || 1337;

app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(express.static('public'));

app.use('/users', users);

app.listen(port, () => {
    console.log(`Listening on ${port}`);
});

module.exports = app; 

/lib/learnFace.js

const client = require('<package>'); // Some package etc per your question

function learnFace(username, picPath) {
    return client.faces.detect({ urls: picPath, attributes: 'all' })
      .then(function(result){
          let newLearn = JSON.parse(result);
          let newTid = newLearn.photos[0].tags[0].tid;
          let fullNameSpace = username + '@notARealNameSpace';

          console.log('You have been registered with the name: ' + username);

          client.tags.save(newTid, fullNameSpace, {label: nameString, password: 'optionalPassword'});

          client.faces.train(nameString, { namespace: 'urface' });
      });
}

module.exports = learnFace;

/routes/users.js

const router = require('express').Router();
const learnFace = require('../lib/learnFace');

router.post('/create', (req, res) => {
    let username = req.body.username;
    let picLink = req.body.pic;

    return learnFace(username, picLink)
        .then(() => {
            return res.sendStatus(201);
        })
        .catch((err) => {
            return res.sendStatus(500);
        })
});

module.exports = router;

此外,您不需要在您不需要的每个文件中都需要Express,只需要您正在使用的文件中所需的内容。