O que o Node.js pode fazer? Ainda não sei quais aspectos ele usa é amplamente e não tenho chance de entrar em contato com esses projetos. Só porque gostei, fiz um site e back -end no meu tempo livre. Eu entendi profundamente uma verdade que, se você gosta de uma tecnologia, pode brincar com ela, mas se você a usar em um projeto, deve passar algum tempo resolvendo muitos problemas.
Técnicas usadas:
Express + Jade
SQLITE + sequelizar
Redis
1. Sobre Jade
O suporte inclui. Por exemplo: inclua ./includes/header cabeçalho é uma visualização parcial, semelhante ao controle do usuário do ASP.NET.
O suporte se estende. Por exemplo: Extends ../layout usa o layout da página mestre.
O loop for tão simples.
A cópia do código é a seguinte:
Cada item no UserList (a variável passada para o front end pelo servidor UserList)
tr
td #{item.username}
td #{item.telephone}
td #{item.email}
Como anexar:
A cópia do código é a seguinte:
estende ../admin_layout
Anexar a cabeça
link (rel = 'Stylesheet', href = '/Stylesheets/font-ewome.css')
script (src = '/javascripts/bootstrap.js')
script (src = '/javascripts/bootstrap wysiwyg.js')
script (src = '/javascripts/jquery.hotkeys.js')
Bloquear o conteúdo
O Append colocará todas as etapas e estilos atrás da cabeça da Página Master.
2. Seveja a estrutura para implementar o ORM. Apoie Sqlite MySQL MongoDB
Definindo o modelo (artigo):
A cópia do código é a seguinte:
var artigo = sequelize.define ('Artigo', {
título:{
Tipo: Sequelize.String,
validar:{}
},
Conteúdo: {Tipo: Sequelize.String, Validar: {}},
Ícone: {Tipo: Sequelize.String, Validar: {}},
ICONNAME: {TYPE: SEQUELIZE.STRING},
Sequenciação: {type: Sequelize.String, Validate: {}}
}, {
ClassMethods: {
// Classificação do artigo
getCountall: function (objfun) {
} // End GetCountall
} // End ClassMethods
});
Artigo.Belongsto (categoria);
Artigo.Belongsto (categoria); Cada artigo tem uma categoria.
Eu escrevi os métodos relacionados à paginação para a hora ao inicializar sequelizar. Dessa forma, haverá esse método (Pageoffset, Pagelimit) ao definir cada modelo.
A cópia do código é a seguinte:
var sequelize = new SequeLize ('Database', 'Nome de usuário', 'Senha', {
// sqlite! agora!
dialeto: 'sqlite',
// O mecanismo de armazenamento para SQLite
// - padrão ': memória:'
Armazenamento: config.sqlitepath,
definir:{
ClassMethods: {
Pageoffset: function (pagenum) {
if (isnan (pagenum) || pagenum <1) {
pagenum = 1;
}
return (pagenum - 1) * this.pagelimit ();
},
pagelimit: function () {
retornar 10; // 10 itens são exibidos por página
},
TotalPages: function (totalnum) {
var total = parseint ((totalnum + this.pagelimit () - 1) / this.pagelimit ()),
ArrayTotalPages = [];
for (var i = 1; i <= total; i ++) {
ArrayTotalPages.push (i);
}
retornar ArrayTotalPages;
}
},
InstanceMethods: {
}
}
});
usar:
A cópia do código é a seguinte:
Artigo.FindandCountall ({incluir: [Categoria], Offset: Artigo.PageOffset (req.query.pagenum), limite: article.pagelimit ()}). Sucesso (função (linha) {
res.render ('artigo_list', {
Título: 'Gerenciamento de artigo',
Articlelist: Row.Rows,
Páginas: {
TotalPages: Article.TotalPages (Row.Count),
CurrentPage: req.query.pagenum,
roteador: 'artigo'
}
});
});
Salve o modelo:
A cópia do código é a seguinte:
exports.add = function (req, res) {
var form = new formidable.incomingForm ();
form.uploaddir = path.join (__ dirname, '../files');
form.KeePextensions = true;
form.parse (req, function (err, campos, arquivos) {
var // iconpath = files.icon.path,
// index = iconpath.lastindexof ('/') <= 0? iconpath.lastindexof ('//'): iconpath.lastindexof ('/'),
icon = path.basename (files.icon.path), // iconpath.substr (índice + 1, iconpath.length - index),
icOnname = files.icon.name;
var title = fields.title;
id = campos.articleId;
title = fields.title,
content = fields.content,
miContent = fields.micontent,
Sequenciamento = Fields.sequencing == 0? 0: 1,
categoria = fields.category;
Artigo.sync (); // Crie a tabela se não existir.
Category.find (categoria) .success (função (c) {
var artigo = artigo.build ({
Título: Título,
Conteúdo: Conteúdo,
MinContent: MinContent,
Ícone: ícone,
ICONNAME: ICONNAME,
Sequenciamento: sequenciamento
});
Artigo.Save ()
.Success (função (a) {
A.SetCategory (C);
return res.redirect ('/admin/artigo');
});
}); // categoria final
});
}
Path.BaseName:
A cópia do código é a seguinte:
// iconpath = files.icon.path,
// index = iconpath.lastindexof ('/') <= 0? iconpath.lastindexof ('//'): iconpath.lastindexof ('/'),
icon = <strong> path.basename </strong> (files.icon.path), // iconpath.substr (index + 1, iconpath.length - index),
Obtenha o nome do arquivo, por exemplo: //b/aa.txt => aa.txt. No começo, usei strings interceptantes, o que também poderia ser implementado, mas se o sistema operacional for diferente, haverá problemas. Mac usa '/'. O seguinte está '//' na janela. Também descobri o problema após a conclusão da implantação. Mais tarde, descobri que o caminho.BaseName foi substituído diretamente (se você ler menos o documento, sofrerá uma perda). Tenho uma boa impressão do Node.js para adicionar 1 ponto. :)
3. Os caches redis freqüentemente consultas e raramente mudam de dados.
A cópia do código é a seguinte:
getCountall: function (objfun) {
Redis.get ('Articles_getCountall', function (err, resposta) {
if (err) {
console.log (err);
retornar;
}
if (Responder === NULL) {
db.all ('Selecione a contagem (artigos.categoryId) como contagem, categorias.name, categories.id de artigos deixados junção categorias em artigos.categoryId = categorias.id Grupo por artigos.categoryId', function (err, linha) {
Redis.Set ('Articles_getCountall', JSON.Stringify (Linha));
objfun (linha);
});
}outro{
objfun (resposta);
}
});
Este método é definido na camada do modelo. Por ser expresso, use o método MVC para desenvolver o máximo possível. De fato, a rota implementa a função da camada do controlador (pasta de rota, que deve ser nomeada controladora).