在主app.js之外提取功能

时间:2017-09-06 08:53:26

标签: node.js socket.io

我对nodejs很新,并且想要保持代码整洁干净,我尝试将函数提取到另一个文件,然后从我的主应用程序中require

我遇到的问题是此功能包含socket-io数据流,并使用http模块使用我的express app

这是主应用,我想将getDetails的内容移到单独的文件中:

const express = require('express');
const app = express();
const spawn = require('child_process').spawn;
const execFile = require('child_process').execFile;
const server = require('http').Server(app);
const io = require('socket.io')(server);

// Set router
const router = express.Router();

// fix body of requests
app.use(bodyParser.urlencoded({extended: true}));
app.use(bodyParser.json());

router.get('/getDetails', (req, res) => {
    const qry = req.query;
    if (qry.func === 'tail') {
        const tail = spawn('ssh', ['root@' + qry.srv, qry.script, qry.func, qry.serv]);
        io.on('connection', function (socket) {

            tail.stdout.on('data', function (data) {
                socket.emit('newLine', {line: data.toString('utf8').replace(/\n/g, '<br>')});
            });
            tail.on('close', (code) => {
                console.log('child process exited with code', code);
            });
            tail.stderr.on('data', (data) => {
                console.log('There are some errors:', data.toString('utf8'));
                socket.emit('newLine', {line: data.toString('utf8')});
            });
        });
        res.sendStatus(200);
    }
    else {
        execFile('ssh', ['root@' + qry.srv, qry.script, qry.func, qry.serv], {timeout: 5000}, (error, stdout, stderr) => {
            if (error) {
                console.error('stderr', error);
                return res.status(500).send({stderr: stderr, error: error});
            }
            return res.status(200).send({stdout: stdout.toString('utf8')});
        });
    }
});

app.use('/', router);
server.listen(port, function () {
    console.log('The magic happens on localhost:' + port);
});

现在我可以module.exports我的单独文件中的所有内容,但是我是否还需要expresshttp

我应该将server.listen移到单独的文件吗?

1 个答案:

答案 0 :(得分:1)

server.js

const express = require('express');
const app = express();
const server = require('http').Server(app);
const io = require('socket.io')(server);
const route = require('./route');


// fix body of requests
app.use(bodyParser.urlencoded({extended: true}));
app.use(bodyParser.json())
app.set('socketio', io);
app.use('/',route);

server.listen(port, function () {
    console.log('The magic happens on localhost:' + port);
});

route.js

const express = require('express');
const router = express.Router();
const Controller = require('./controller');

router.post('/register',Controller.getDetails);

module.exports=router;

controller.js

const spawn = require('child_process').spawn;
const execFile = require('child_process').execFile;



const controller = {

    getDetails : (req,res)=>{
// now use socket.io in your controller file
    var io = req.app.get('socketio');
        const qry = req.query;
    if (qry.func === 'tail') {
        const tail = spawn('ssh', ['root@' + qry.srv, qry.script, qry.func, qry.serv]);
        io.on('connection', function (socket) {

            tail.stdout.on('data', function (data) {
                socket.emit('newLine', {line: data.toString('utf8').replace(/\n/g, '<br>')});
            });
            tail.on('close', (code) => {
                console.log('child process exited with code', code);
            });
            tail.stderr.on('data', (data) => {
                console.log('There are some errors:', data.toString('utf8'));
                socket.emit('newLine', {line: data.toString('utf8')});
            });
        });
        res.sendStatus(200);
    }
    else {
        execFile('ssh', ['root@' + qry.srv, qry.script, qry.func, qry.serv], {timeout: 5000}, (error, stdout, stderr) => {
            if (error) {
                console.error('stderr', error);
                return res.status(500).send({stderr: stderr, error: error});
            }
            return res.status(200).send({stdout: stdout.toString('utf8')});
        });
    }
    }

}
module.exports=controller;