Skip to content

Instantly share code, notes, and snippets.

@russll

russll/server.js Secret

Last active March 31, 2017 11:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save russll/097c1b59734dc364f45ad6a297b5367c to your computer and use it in GitHub Desktop.
Save russll/097c1b59734dc364f45ad6a297b5367c to your computer and use it in GitHub Desktop.
Пример server.js
'use strict';
import path from 'path';
import express from 'express';
import { backendLogger, clientLogger, accessLogger } from './log';
import bodyParser from 'body-parser';
import cookieParser from 'cookie-parser';
import morgan from 'morgan';
import debugLib from 'debug';
import { navigateAction } from 'fluxible-router';
import app from '../../index';
import detectUserAgent from './detectUserAgent';
import detectProject from './detectProject';
import authorizeByToken from './authorizeByToken';
import setCurrentUrl from './setCurrentUrl';
import getAssets from './getAssets';
import render from './render';
import checkApplicationError from '../../actions/checkApplicationError';
import useragent from 'express-useragent';
import museum from './museum';
import robots from './robots';
import sitemap from './sitemap';
import rss from './rss';
import healthcheck from './healthcheck';
import ensureHttps from './ensureHttps';
import config from '../../config/app';
const server = express();
const debug = debugLib('square');
const sign = 'applications/server/server.js';
server.set('state namespace', 'App');
if (config.prettyLogs) {
server.use(morgan('dev'));
} else {
server.use(accessLogger);
}
if (config.httpsOnly) {
server.use(ensureHttps);
}
/**
* Static routes
*/
server.use(express.static(path.join(__dirname, '../..', 'build/public'), { maxAge: '1d' })); // for public/assets/
server.use('/public', express.static('public', { maxAge: '30d' })); // for public/
server.use('/yandex_45805f698fc4f5e8.html', express.static('public/verification/yandex_45805f698fc4f5e8.html'));
server.use('/google70f97f455797fedc.html', express.static('public/verification/google70f97f455797fedc.html'));
// apple-touch
server.use('/apple-touch-icon-precomposed.png', express.static('public/apple-touch-icon.png'));
server.use('/apple-touch-icon.png', express.static('public/apple-touch-icon.png'));
server.use('/apple-touch-icon-120x120.png', express.static('public/apple-touch-icon.png'));
server.use('/apple-touch-icon-120x120-precomposed.png', express.static('public/apple-touch-icon.png'));
server.use(sitemap);
server.use(rss);
server.use(cookieParser());
server.use(bodyParser.json());
server.use(useragent.express());
process.on('uncaughtException', function(err) {
backendLogger.error(err);
});
server.get('/status', (req, res) => res.status(200).send('OK'));
server.post('/api/log', (req, res) => {
let ip = req.ips[0] || req.ip;
let logData = {
type: 'square',
clientIp: ip,
userAgent: req.get('User-Agent'),
referer: req.get('Referer'),
error: req.body
};
clientLogger.error(logData);
res.json({status: 'ok'});
});
server.get('/robots.txt', robots);
server.get('/healthcheck', healthcheck);
server.use(museum);
server.use(getAssets);
server.get('*', (req, res) => {
debug('%s Формирование документа, %s', sign, req.path);
const timeStart = Date.now();
const context = app.createContext({req, res});
debug('%s Создание контекста приложения', sign);
Promise.all([
detectUserAgent(context, req),
detectProject(context, req),
setCurrentUrl(context, req)
])
.then(() => {
return authorizeByToken(context, req);
})
.then(() => {
debug('%s Вызов navigateAction', sign);
context.executeAction(navigateAction, {url: req.url}, err => {
debug('%s navigateAction выполнен', sign);
if (err) {
/**
* Получение url для релиректа из executeCritical и ошибки промиса
*/
const redirectUrl =
err.setProject && err.setProject.statusCode == 301 && err.setProject.redirectUrl ||
err.statusCode == 301 && err.redirectUrl;
if (redirectUrl) {
return res.redirect(redirectUrl);
}
backendLogger.error(err);
}
context.executeAction(checkApplicationError, err, () => {
const html = render(app, context, req.assetsData);
const navigateError = context.getStore('RouteStore').getCurrentNavigateError();
const status = getStatus(navigateError);
debug('%s Отправка документа, общее время выполнения %s', sign, (Date.now() - timeStart) + 'ms');
res.status(status).send(html);
});
});
})
.catch(err => {
backendLogger.error(err);
});
});
function getStatus(navigateError) {
if (!navigateError) {
return 200;
}
if (navigateError.statusCode === 404) {
return 404;
}
return 500;
}
export default server;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment