簡體   English   中英

Node Express給出兩個響應,中斷前端腳本

[英]Node Express gives two responses, breaks front-end script

由於我的Express路由中的某些內容,數據似乎兩次發送到Angular前端。 這似乎使Mixpanel陷入無限循環,導致部分應用無法正確加載。

以下代碼的原因是我想檢測某些用戶代理並將其發送給普通用戶看不到的東西。 這是因為某些用戶代理不會加載Javascript,但是我需要他們從頁面中抓取一些信息。

從我的server.js

app = express();

app 
    .use( morgan( 'dev' ) )
    .use(bodyParser.urlencoded( { limit: '50mb', extended: true } ) )
    .use( bodyParser.json( { limit: '50mb' } ) )
    .use( '/api', require('./routes/usersRoute.js') )
    .use( express.static( indexPath ) )
    .all( '/*', require( './routes/home.js' ) )

從我的home.js

router.get( '/:user/:stream/:slug', function( req, res, next ) {

    if ( req.headers['user-agent'].indexOf( 'facebook' ) != -1 ) {
                    if ( !req.params.user && !req.params.stream && !req.params.slug ) return next()

        contentController.findUserId( req.params.user )
        .then( function ( userId ) {
            if ( !userId ) return next()

            contentController.projectContent( req.params.slug )
            .then( function ( item ) {
                if ( !item ) return next()

                createOpenGraph( item[0] )
                .then( function ( OG ) {
                    return res.status( 200 ).send( OG )
                })
                .catch( function ( error ) {
                    console.log( error )
                    return res.status( 500 ).json( error )
                })
            })
        })
    } else { 
        return res.status( 200 )
            .set( { 'content-type': 'text/html; charset=utf-8' } )
            .sendFile( indexPath )
    }
})

router.get( '/*', function( req, res ) {
    return res.status( 200 )
        .set( { 'content-type': 'text/html; charset=utf-8' } )
        .sendFile( indexPath )
})

幾頁似乎壞了,我不確定為什么有些頁面壞了而其他頁面卻沒有。 值得注意的是,我試圖在home.js中的.get( '/:user/:stream/:slug'...)函數中home.js到的home.js中斷。 在該頁面上的控制台中,我可以看到一個錯誤,即角度加載兩次,這證實了混合面板由於雙重響應問題而損壞。 在不會中斷的頁面上不會出現此錯誤。 此外,我可以看到,每次我在損壞的頁面上加載時都會調用這兩個函數(在home.js ),而不是在工作頁面上都被調用。

我願意就如何做得更好提出所有建議。

您已經在routes/home.js文件上定義了要在其他任何匹配路由之前調用的路由。 因此,您需要將控件傳遞給執行下一個參數的下一個路由。 可能您想在另一條路由上發送文件,例如在.use( '/app', require('./routes/appRoutes.js') )或在最后一個方法上發送示例中的文件。

router.get( '/:user/:stream/:slug', function( req, res, next ) {

  if ( req.headers['user-agent'].indexOf( 'facebook' ) != -1 ) {
    /*Do the facebook stuff*/
  } else { 
     res.status( 200 );
  }
  next();
 });

// route / appRoutes.js

    router.get( '/*', function( req, res, next ) {
        return res.status( 200 )
        /*Set you headers independently on the api routes as you might prefer to set the content type to application/json*/
         .set( { 'content-type': 'text/html; charset=utf-8' } )
         .sendFile(indexPath ).end();
    });

// server.js

app = express();

app.use( morgan( 'dev' ) )
    .use(bodyParser.urlencoded( { limit: '50mb', extended: true } ) )
    .use( bodyParser.json( { limit: '50mb' } ) )
    .use( '/api', require('./routes/usersRoute.js') )
    .use( '/app', require('./routes/appRoutes.js') )
    .use( express.static( indexPath ) )
    .all( '/*', require( './routes/home.js' ) );

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM