2016-12-16 2 views
1

Ich bin neuer in Express, Bereitstellung einer Express-App. Ich möchte eine Funktion checkApiKey vor jeder aufgerufenen API aufrufen. hier ist meine API RoutenExpress-Routen verschachtelt Rückruf

var express = require('express'); 
var router = express.Router(); 
var fn = require('../webservices'); 
router.post('/api/signup',fn.checkApiKey, fn.signup); 
module.exports = router; 

und hier meine webservice.js

var fs = require('fs'), 
    path = require('path'); 
var db = require('./conn') 
var models = require('./models') 

function signup(req, res, next){ 
    var postData = req.body; 
    console.log('signup called', postData); 
    checkApiKey(req, res, function(err, done){ 
    models.user.save(postData, function(err, saved) { 
     console.log('err', err); 
     if(err) return res.status(200).json({ status: "fail", message: 'Server Error' }); 
     return res.status(200).json({ status: "success", data:saved, message: 'Success' }); 
    }) 
    }) 
} 

function checkApiKey(req, res, next){ 
    console.log('checkApiKey called'); 
    if(req.body.apiKey!='123') return res.status(200).json({ status: "fail", message: 'ApiKey not Match' }); 
    return next(req, res); 
} 

module.exports = { 
    signup, checkApiKey 
} 

hier checkApiKey genannt, aber die Registrierung nicht Fehlerstatus 500 beim Entfernen fn.checkApiKey dann erfolgreich anmeldet auch wenn ich

verwenden genannt
router.post('/api/signup',function (req, res, next){ 
    console.log('checkApiKey called'); 
    if(req.body.apiKey!='123') return res.status(200).json({ status: "fail", message: 'ApiKey not Match' }); 
    return fn.signup(req, res); 
}); 

das funktioniert, aber ich muss jedes Mal Code für jedes API schreiben kann mir jemand helfen, den richtigen Weg zu finden

Antwort

0

Versuchen Sie diese. var app = express();

app.use (checkApiKey);

es auf vor jedem Anruf nennen ..

1

Sie verwenden module.exports falsch. Es sollte sein:

module.exports = { 
    signup: signup, 
    checkApiKey: checkApiKey 
} 

Auch checkApiKey aus Ihrer signup Middleware nehmen:

function signup(req, res, next){ 
    var postData = req.body; 

    models.user.save(postData, function(err, saved) { 
    if(err) return res.status(200).json({ status: "fail", message: 'Server Error' }); 
    return res.status(200).json({ status: "success", data:saved, message: 'Success' }); 
}) 
} 

Dann sollte das hervorragend funktionieren:

var fn = require('../webservices'); 
router.post('/api/signup', fn.checkApiKey, fn.signup); 
2

Da express eine Middleware ist es, Ihnen die checkAPikey machen in jeder Anfrage durch Hinzufügen des folgenden Codes wie imran sagte:

app.use((req, res, next) => { 
    if (req.body.apiKey!='123') return res.status(200).json({ status: "fail", message: 'ApiKey not Match' }); 
    next(req, res); 
}) 

Sie werden ähnlichen Code in app.js oder server.js sehen, wo standardmäßig das Body-Parser-Paket erstellt wird (wenn Sie das Skelett zum Beispiel per Express-Generator erzeugen).

Wenn Sie diesen Code in app.js eingeben, wird zuerst der oben geteilte Code und dann Ihre Anfrage über next() angezeigt.