¿Qué puede hacer Node.js? Todavía no sé qué aspectos usa son bastante, y no tengo la oportunidad de entrar en contacto con tales proyectos. Solo porque me gustó, hice un sitio web y backend en mi tiempo libre. He entendido profundamente una verdad que, si te gusta una tecnología, puedes jugar con ella, pero si la usas en un proyecto, debes pasar algún tiempo resolviendo muchos problemas.
Técnicas utilizadas:
Express + Jade
SQLITE + SECELIZARSE
rehacer
1. Acerca de Jade
El apoyo incluye. Por ejemplo: incluir ./includes/header el encabezado es una vista parcial, similar al control de usuario ASP.NET.
El apoyo se extiende. Por ejemplo: se extiende ../Layout usa el diseño de la página maestra.
El bucle for es tan simple.
La copia del código es la siguiente:
Cada elemento en UserList (la variable pasada a la parte delantera por el servidor de la lista de usuarios)
TR
TD #{item.userName}
TD #{item.telephone}
TD #{item.email}
Como agregar:
La copia del código es la siguiente:
extiende ../admin_layout
adjuntar cabeza
link (rel = 'stylesheet', href = '/stylesheets/font-awesome.css')
script (src = '/javascripts/bootstrap.js')
script (src = '/javascripts/bootstrap-wysiwyg.js')
script (src = '/javascripts/jQuery.hotkeys.js')
Bloquear contenido
Append colocará todos los pasos y estilos detrás de la cabeza de la página maestra.
2. Singe el marco para la implementación de ORM. Soporte SQLite MySQL MongoDB
Definición del modelo (artículo):
La copia del código es la siguiente:
VAR Artículo = SECLEZIZE.FINE ('Artículo', {
título:{
Tipo: SECLELIZE.String,
validar:{}
},
Contenido: {Tipo: Sequelize.String, Validate: {}},
icon: {type: secelize.string, validate: {}},
iconName: {type: secelize.string},
secuenciación: {Tipo: SECLELIZE.String, Validate: {}}
}, {
ClassMethods: {
// Clasificación de artículos
getCountall: function (objfun) {
} // finalizar getCountall
} // finalizar classmethods
});
Artículo.belongsto (categoría);
Artículo.belongsto (categoría); Cada artículo tiene una categoría.
Escribí los métodos relacionados con la paginación al momento al inicializar la secuela. De esta manera, habrá este método (PageOffset, Pagelimit) al definir cada modelo.
La copia del código es la siguiente:
var secelize = new Sequelize ('Base de datos', 'Nombre de usuario', 'Password', {
// sqlite! ¡ahora!
dialecto: 'sqlite',
// El motor de almacenamiento para SQLite
// - predeterminado ': memoria:'
Almacenamiento: config.sqlitePath,
definir:{
ClassMethods: {
PageOffset: function (Pagenum) {
if (isnan (pageno) || pageno <1) {
pageno = 1;
}
return (pageno - 1) * this.pagelimit ();
},
pagelimit: functer () {
regresar 10; // se muestran 10 elementos por página
},
TotalPages: function (totalNum) {
var total = parseInt ((totalNum + this.pagelimit () - 1) / this.pagelimit ()),
ArrayTotalPages = [];
para (var i = 1; i <= total; i ++) {
ArrayTotalPages.push (i);
}
return ArrayTotalPages;
}
},
Instancemethods: {
}
}
});
usar:
La copia del código es la siguiente:
Artículo
res.render ('Artículo_list', {
Título: 'Gestión de artículos',
Articlelist: Row.Rows,
Páginas: {
TotalPages: Artículo.TotalPages (Row.Count),
CurrentPage: req.query.pagenum,
enrutador: 'artículo'
}
});
});
Guardar el modelo:
La copia del código es la siguiente:
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, archivos) {
var // iconpath = files.icon.path,
// index = iconpath.lastindexof ('/') <= 0? iconpath.lastindexof ('//'): iconpath.lastindexof ('/'),
icon = path.basename (files.icon.path), // iconpath.substr (index + 1, iconpath.length - índice),
iconName = files.icon.name;
VAR Title = Fields.title;
id = Fields.articleId;
title = Fields.title,
content = Fields.Content,
MinContent = Fields.Mincontent,
secuenciación = fields.sequencing == 0? 0: 1,
categoría = Fields.Category;
Artículo.sync (); // Crear tabla si no existe.
Categoría.find (categoría) .success (función (c) {
VAR Artículo = Artículo.Build ({
Título: Título,
Contenido: Contenido,
Mincontent: mincontent,
icono: icono,
iconname: iconname,
secuenciación: secuenciación
});
Artículo.save ()
.success (función (a) {
A.SetCategory (c);
return res.redirect ('/admin/artículo');
});
}); // finalizar la categoría
});
}
Path.Basename:
La copia del código es la siguiente:
// 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 - índice),
Obtenga el nombre del archivo, por ejemplo: /a/b/aa.txt => aa.txt. Al principio utilicé cadenas de interceptación, que también podrían implementarse, pero si el sistema operativo es diferente, habrá problemas. Mac usa '/'. Lo siguiente es '//' en la ventana. También descubrí el problema después de que se complete el despliegue. Más tarde descubrí que Path.Basename fue reemplazado directamente (si lee menos el documento, sufrirá una pérdida). Tengo una buena impresión de Node.js para agregar 1 punto. :)
3. Redis cachores consultan frecuentemente y rara vez cambia los datos.
La copia del código es la siguiente:
getCountall: function (objfun) {
redis.get ('Articles_getCountall', function (err, respuesta) {
if (err) {
console.log (err);
devolver;
}
if (respuesta === nulo) {
db.all ('Seleccione Count (Articles.CategoryId) como Count, categorías.name, categorías.id de los artículos Left Categories en Articles.CategoryId = Categories.id Group por Articles.CategoryId', Function (ERR, Row) {
redis.set ('Articles_GetCountall', json.stringify (fila));
objfun (fila);
});
}demás{
objfun (respuesta);
}
});
Este método se define en la capa del modelo. Debido a que es expresa, use el método MVC para desarrollar lo más posible. De hecho, la ruta implementa la función de la capa del controlador (carpeta de ruta, que debe llamarse controlador).