Вам необходимо подключить политики и связанные с ними действия. Лучше всего, я бы сказал, создать новый проект с включенным внешним интерфейсом и посмотреть, как он настроен. Это использует промежуточное программное обеспечение политики, чтобы вызвать действия политики.
module.exports.policies = {
'*': 'is-logged-in',
// Bypass the `is-logged-in` policy for:
'entrance/*': true,
'account/logout': true,
'view-homepage-or-redirect': true,
'deliver-contact-form-message': true,
};
Здесь вы видите, что policy.js
в папке /config
вызывает is-logged-in
для всех контроллеров по умолчанию. Вы также видите, что есть некоторые исключения, добавленные ниже.
is-logged-in
- это файл /api/policies/is-logged-in.js
:
module.exports = async function (req, res, proceed) {
// If `req.me` is set, then we know that this request originated
// from a logged-in user.
if (req.me) {
return proceed();
}
// Otherwise, this request did not come from a logged-in user.
return res.unauthorized();
};
Это часть, которая проверяет статус пользователя, вошедшего в систему. Вы можете видеть, что он использует часть req.me
, которая установлена в api/hooks/custom/index.js
. Здесь он загружает пользователя из базы данных и делает данные зарегистрированных пользователей доступными для объекта req.
Если у вас нет или вы хотите использовать этот хук, вы можете обменяться req.me
с req.session.userId
, предполагая, что вы установили userId
для объекта сеанса в вашем обработчике входа в систему , Пример из Sails-code:
....
var userRecord = await User.findOne({
emailAddress: inputs.emailAddress.toLowerCase(),
});
// check user exist
....
// check password
....
//check remember-me
....
// Modify the active session instance.
this.req.session.userId = userRecord.id;
// Send success response (this is where the session actually gets persisted)
return exits.success();
....
Я надеюсь, что это поможет вам выбрать правильный путь, по крайней мере, с точки зрения того, где копать глубже.
Извините, я не видел Ваш комментарий до сейчас. Код ниже компиляций на Linux очень хорошо, таким образом, я надеюсь, что он работает на Вас.
printf () печатает в шестнадцатеричном числе, Вы получите 2 символа для каждого байта.
#include <stdio.h>
struct msg_on_send
{
char descriptor_msg[5];
int address;
char space;
char cmdmsg[5];
char CR;
char LF;
};
void USARTWrite(const void *object, size_t size)
{
const unsigned char *byte;
for ( byte = object; size--; ++byte )
{
printf("%02X", *byte);
}
putchar('\n');
}
int main (int argc, char**argv)
{
struct msg_on_send myMsg;
unsigned char* ptr= (unsigned char*)&myMsg;
USARTWrite(ptr, sizeof(myMsg));
return 0;
}
Я надеюсь, что это помогает.
~
~
Вы не должны на самом деле копировать структуру в массив байтов. Вы могли дополнительно сделать это:
struct msg_on_send myMessage;
// code to set myMessage to whatever values...
// get a byte pointer that points to the beginning of the struct
uint8_t *bytePtr = (uint8_t*)&myMessage;
// pass that into the write function, and it will write the amount of bytes passed in
USARTWrite(bytePtr, sizeof(myMessage));
Питание указателей!:)
Ваш struct
вот просто массив байтов, именно никакие указатели не указывают из него.
Копия от участника к участнику, скорее всего, выполняется для преодоления выравнивания, как (char*) &address
вероятно, будет больше, чем ((char*) &descriptor_msg) + 5
.
USARTWrite
отправляет HEX
коды байтов Вашей структуры к stdout
, но выравнивание отбрасываний. Компиляция этого кода с различными стратегиями выравнивания приведет к различным выводам.
Включите свое описание структуры в #pragma pack(push, n)
и #pragma pack(pop)
вызвать выравнивание и просто скопировать Ваш от байта к байту структуры.
Это довольно просто: 1. ArrayBuild берет указатель на message_on_send структуру, и для каждого участника там, использует memcpy для копирования байтов в массив символов, который был передан в подобном так -
char byteArray[17]; // This assumes 4-byte ints
// be careful though, the length *must* be long enough, or
// Bad Things will happen
size_t msgSize; // Holds the size of the message built by ArrayBuild,
// passed to USARTWrite
struct msg_on_send myMessage;
// Code to fill up myMessage appropriately
msgSize = ArrayBuild(byteArray, &myMessage); // need the & to pass a pointer as required
USARTWrite(myMessage, msgSize);
USARTWrite просто дают массив символов и размер - он захватывает каждый символ в свою очередь и печатает его на экран как шестнадцатеричное значение с printf ().
'Волшебство' находится в ArrayBuild - memcpy, делает литеральную копию байтов от источника до места назначения, без перевода. Принимая 4 байта ints, массив, созданный функцией, будет похож так:
1 1 1 1 1 1 1
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6
| A | B |C| D |E|F|
A = descriptor_msg (char[5])
B = address (int)
C = space (char)
D = cmdmsg (char[5])
E = CR (char)
F = LF (char)
Я предположил бы, что в 'реальном' приложении, printf () вызов будет заменен вызовом к записи последовательного порта.
Если я хочу рассматривать структуру как массив байтов, я обычно использую объединение для объединения структуры с массивом байтов. Например:
typedef union
{
struct
{
char descriptor_msg[5];
int address;
char space;
char cmdmsg[5];
char CR;
char LF;
};
BYTE bytes[];
} msg_on_send;